Установка и сброс DATEFORMAT в SQLServer 2005 - PullRequest
5 голосов
/ 20 ноября 2008

Есть ли способ запросить текущую версию DATEFORMAT, которую SQLServer 2005 использует с T-SQL?

У меня есть приложение, которое читает предварительно сгенерированные INSERT-операторы и выполняет их в базе данных. Чтобы сделать данные для вставки независимыми от культуры, я храню значения datetime, представленные в инвариантной культуре (месяц / день / год ...). Сервер базы данных может работать в разных языковых стандартах, в зависимости от языкового стандарта системы (возможно, с использованием дня / месяца / года), поэтому вставка может произойти сбой из-за невозможности анализа даты и времени.

Я знаю, что в T-SQL есть операторы "SET LANGUAGE" и "SET DATEFORMAT" для установки используемой локали.
Я не хочу делать эти изменения постоянными (они постоянны?), Поэтому я ищу способ прочитать DATEFORMAT из БД, сохранить его, изменить формат по своему вкусу и сбросить его до сохраненного значения после данные были вставлены.

Есть идеи, где найти это значение на сервере?

Ответы [ 5 ]

6 голосов
/ 20 января 2010

Следующая инструкция выполнит операцию анализа даты, используя заданный формат даты (переменная @dateFormat), а затем снова включит исходный формат даты.

declare @dateFormat nvarchar(3);
set @dateFormat = 'dmy';

declare @originalDateFormat nvarchar(3);
select @originalDateFormat = date_format from sys.dm_exec_sessions where session_id = @@spid;

set dateformat @dateFormat;

--Returns 1.
select isdate('31/12/2010');

set dateformat @originalDateFormat;

Обратите внимание, что изменения формата даты применяются только к текущему соединению. Повторное включение исходного формата даты выполняется только для того, чтобы это изменение не повлияло на последующие операторы, выполненные в том же соединении.

5 голосов
/ 20 ноября 2008

Set Language и Set DateFormat влияют только на текущий сеанс. Если вы отключитесь от базы данных и подключитесь снова, язык и формат даты вернутся к значениям по умолчанию.

Существует один трюк, который вы можете использовать, чтобы определить, является ли DateFormat m / d / y или d / m / y.

Select DatePart(Month, '1/2/2000')

Эта дата действительна в любом случае. Это 2 января или 1 февраля. Если этот запрос возвращает 1, то у вас есть MDY. Если он возвращает 2, у вас есть DMY.

4 голосов
/ 21 ноября 2008

А как насчет столбца формата date_ в sys.dm_ exec_sessions?

Вы всегда можете просмотреть свой собственный сеанс, поэтому не требуются права на уровне сервера

1 голос
/ 17 июля 2012

Я нашел способ получить это в таблице пользовательских параметров в другом месте и преобразовал его, чтобы получить только формат даты. Это может быть полезно для других (обратите внимание, что в этой же таблице находятся различные другие настройки, чтобы вы могли проверить, установлены ли ansi_nulls и другие разные вещи одинаково):

create table #temp (SetOption nvarchar(50),Val nvarchar(50))

insert into #temp
exec sp_executesql N'dbcc useroptions'

select val from #temp where setoption='dateformat'

drop table #temp
1 голос
/ 20 ноября 2008

Если еще не слишком поздно, отправьте свои даты в виде ГГГГММДД на SQL Server, и они всегда будут вставлены правильно, независимо от настроек формата даты DMY или MDY

SET DATEFORMAT также не является постоянным. По моему опыту, это влияет на эту конкретную связь. Некоторые говорят, что сеанс только, но я обнаружил, что если соединение возвращается в пул и используется повторно до того, как оно потеряно, оно сохраняет настройку формата даты, установленную предыдущим пользователем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...