2010-10-21 2 views
4

На мой установку SQL Server, если я выполняю следующееSQL Дата сервера Casting Выпуск

SELECT CAST('2008-05-03 00:00:00' AS DATETIME), CAST('2008-05-03T00:00:00' AS DATETIME) 

Тогда я получаю следующий результат

2008-03-05 00:00:00.000 2008-05-03 00:00:00.000 

Теперь это странно само по себе, как я не конечно, почему он разобрал первую дату как yyyy/dd/mm (мой логин установлен на британский английский btw), и этот формат даты не является стандартным AFAIK.

Я не уверен, с чего начать, пытаясь решить эту проблему нечетного разбора, которая, похоже, не срабатывает ни в одной из моих коллег-систем.

ответ

3

Ваш первый формат действительно зависит от языка (ODBC канонический), и поскольку ваша система определена как «британский английский», она будет интерпретирована как YYYY-DD-MM (если это «американский английский», это будет интерпретироваться как YYYY-MM-DD).

Однако второй - это ISO-8601 standard date format (Wikipedia), который будет работать с любой установкой SQL Server, независимо от ваших языковых или языковых настроек. Это формат всегдаYYYY-MM-DDTHH:MM:SS и будет интерпретироваться как таковой.

Попробуйте это:

SET LANGUAGE british 

SELECT 
    CAST('2008-05-03 00:00:00' AS DATETIME) 'UK Date', 
    CAST('2008-05-03T00:00:00' AS DATETIME) 'UK ISO Date' 

SET LANGUAGE us_english 

SELECT 
    CAST('2008-05-03 00:00:00' AS DATETIME) 'US Date', 
    CAST('2008-05-03T00:00:00' AS DATETIME) 'US ISO Date' 

Мой вывод:

UK Date     UK ISO Date 
2008-03-05 00:00:00.000 2008-05-03 00:00:00.000 

US Date     US ISO Date 
2008-05-03 00:00:00.000 2008-05-03 00:00:00.000 
+0

Это интересно, потому что первый, «2008-05-03 00:00:00», интерпретируется как гггг-мм-дд на любой другой db на нашем предприятии (50+), а не на yyyy-dd-mm, который, по-моему, делает мой сервер. –

+0

@ Chris Meek: мальчик, эти преобразования даты действительно становятся беспорядочными временами! Обновлен мой ответ с, надеюсь, правильным утверждением сейчас .... –

+0

@Chris Каков формат даты сервера? Имейте в виду, что SQL Server по умолчанию используется в формате США, даже при установке на британском английском сервере ... –

1

Можно ли использовать вместо преобразования? Это позволит вам указать формат даты, которые я не уверен, что вы можете сделать, используя бросок:

SELECT CONVERT(DATETIME, '2008-05-03 00:00:00', 120), CONVERT(DATETIME, '2008-05-03T00:00:00', 126) 

Вы можете посмотреть на различные форматы здесь можно: http://msdn.microsoft.com/en-us/library/ms187928.aspx

1

Он использует конфигурацию СОРТ- как в вашей сессии. Вы можете избежать двусмысленности установить формат даты в строке:

SET dateformat dmy 
SELECT CAST('2008-05-03 00:00:00' AS DATETIME), CAST('2008-05-03T00:00:00' AS DATETIME) 
-- 2008-03-05 00:00:00.000 2008-05-03 00:00:00.000 

SET dateformat mdy 
SELECT CAST('2008-05-03 00:00:00' AS DATETIME), CAST('2008-05-03T00:00:00' AS DATETIME) 
-- 2008-05-03 00:00:00.000 2008-05-03 00:00:00.000 
Смежные вопросы