перестало работать преобразование даты и времени на сервере sql - PullRequest
1 голос
/ 25 января 2012

Я озадачен ошибкой, которая вчера неожиданно появилась на моем производственном сервере. Я делаю запрос LINQ2SQL, например:

var mis = from m in dtcx.valori 

                  join p in dtcx.TEPARAMs on m.PARAMCD equals p.PARAMCD
                  where  

                  blah blah blah

                  select new
                  {
                      dataRilevazione = m.dataRilevazione,
                      id =m.data>=new DateTime(2010,02,26)&&m.X==3&&m.Y==69?100: m.id, 

                       blah blha
                  };

это преобразуется в запрос SQL, который имеет условие:

N'SELECT [t0].[dataRilevazione], 
    (CASE 
        WHEN ([t0].[data] >= @p6) AND ([t0].[X] = @p7) AND ([t0].[Y] = @p8) THEN @p9

с

@p6='2010-02-26 00:00:00'

это работало как очарование целую вечность, так как два дня назад, когда он перестал работать, сказал, что произошел неправильный переход от varchar к datetime.

На самом деле проблема в том, что 2010-02-26 00:00:00 больше не преобразуется в дату! если я попытаюсь

печать

convert(datetime,'2010-02-26 00:00:00'  ) 

Я получаю ту же ошибку, которая исчезает при использовании

convert(datetime,'2010-02-26 00:00:00', datetime)

поскольку, когда все работало, я не менял ни пользователя, ни его локаль, ни все, что мне известно.

что я могу сделать? спасибо

UPDATE: При профилировании SQL Server, linq 2 sql, кажется, устанавливает правильный язык:

-- network protocol: TCP/IP
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed

так что язык установлен на us_english! Почему преобразование по-прежнему не удается, мне не подходит! Любая идея ценится ...

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Вы не говорите, в какой локали вы находитесь, поскольку это будет иметь значение - вы говорите, что оно не изменилось, но я бы с осторожностью отнесся к такому предположению :-) Одна вещь, о которой следует помнить, заключается в том, что форматы даты и времени в США и Великобритании трактуются по-разному в «обратном» формате:

  • Локализация в Великобритании видит дату как yyyy-dd-mm hh:mm:ss.fff
  • Локали США видят дату как yyyy-mm-dd hh:mm:ss.fff

Вы можете проверить язык / язык, который вы используете в данный момент, выполнив SELECT @@LANGUAGE.

Например, это выдает ошибку:

SET LANGUAGE british
GO
SELECT CAST ('1999-01-21 10:11:12.345' AS DATETIME)
GO

Однако, если вы измените локаль на us_english, она будет правильно проанализирована.

Если вы хотите гарантировать, что он всегда будет анализироваться как yyyy-mm-dd, тогда вам нужно быть строгим и использовать полную спецификацию ISO, указав T между датой и временем, например: 1999-01-21T10:11:12.345 будет анализировать в одинаково в обеих локалях.

Еще одна забавная вещь, на которую нужно обращать внимание при манипулировании данными даты / времени.

Sidenote: нет, я не знаю, почему Microsoft считает, что мы, правые пондианцы, здесь, в Блайти, видим дату как гггг-дд-мм ... Я никогда не сталкивался с этим форматом. Может быть унаследован от европейских форматов?

0 голосов
/ 25 января 2012

Посмотреть разные результаты:

SET LANGUAGE English
SELECT convert(DATETIME, '2010-02-01 00:00:00')
SET LANGUAGE French
SELECT convert(DATETIME, '2010-02-01 00:00:00')
SET LANGUAGE Italian
SELECT convert(DATETIME, '2010-02-01 00:00:00')

Результаты:

2010-02-01 00:00:00.000
2010-01-02 00:00:00.000
2010-01-02 00:00:00.000

И, как в вашем примере при использовании new DateTime(2010,02,26) с французским, Итальянский или подобный язык может вызвать эту ошибку

Проверка параметров сеанса с помощью DBCC USEROPTIONS - языковая опция, особенно

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