почему мои 126 даты не возвращаются с буквой T в середине? - PullRequest
2 голосов
/ 25 января 2010

Я решил, что буду использовать 8601 datetime для всех дат, которые я возвращаю из своего приложения. Внезапно, в одном конкретном процессе, getdate () не возвращает дату и время с буквой T в середине. Следует также упомянуть, что я преобразую набор, содержащий дату и время, в XML , используя FOR XML PATH. Обычно, когда я конвертирую таблицу с датой и временем в xml, я получаю 8601 отформатированные даты. Но в одном случае я не.

select (cast(getdate() as datetime)) -- returns 2010-01-25 10:13:46.033

Так что я прямо конвертировал это так:

select convert(datetime, getdate(), 126) -- returns 2010-01-25 10:14:35.923

Но если я брошу его на nvarchar, я получу T !!

SELECT CONVERT(NVARCHAR(30), GETDATE(), 126) -- returns 2010-01-25T10:15:29.633

Что еще страннее для меня, это то, что если я выберу несколько версий этого с объединением, версия T исчезнет. Но при выборе без объединения версия T (последняя) остается.

-- returns 4 rows of 2010-01-25 10:15:57.333
select getdate() union all 
select (cast(getdate() as datetime))  union all
select convert(datetime, getdate(), 126)    union   all
SELECT CONVERT(NVARCHAR(30), GETDATE(), 126) 

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

Ссылка ("гггг-мм-ддтч: ми: сс.ммм" для 126): http://msdn.microsoft.com/en-us/library/ms187928.aspx

Ответы [ 4 ]

4 голосов
/ 25 января 2010

Вы смешиваете значения даты и времени с форматированными строками.

Первые два примера вообще не возвращают форматированную дату, это просто значение datetime. То, как значение форматируется в текст, определяется тем, как вы отображаете значение после его получения из базы данных. Если вы проживали в другой стране, и настройки культуры по умолчанию были другими, например, вместо даты можно отобразить 1/25/2010 10:14 AM.

Во втором примере параметр формата (126) игнорируется, поскольку при преобразовании значения datetime в значение datetime не происходит форматирование или синтаксический анализ.

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

Если вы используете объединение с разностными типами данных, то тип результата определяет приоритет типа . Тип datetime имеет более высокий приоритет, чем nvarchar, поэтому он пытается преобразовать значения nvarchar в datetime.

1 голос
/ 25 января 2010

GETDATE() уже возвращает DATETIME, поэтому это выражение:

CONVERT(datetime, getdate(), 126)

ничего не делает.

Вы можете заменить любой другой параметр формата, даже пропустив часть CONVERT: результат будет таким же.

Строковое представление возвращаемого DATETIME выбирается клиентом, а не сервером.

Его внутреннее представление представляет собой 8 -байтное целое число, причем первые 4 байтов обозначают количество дней с 1900-01-01, а вторые 4 байтов обозначают количество 1/300 секунд с полуночи.

Когда вы преобразуете в NVARCHAR, сервер создает текстовое представление и возвращает его как есть. В этом случае вы видите T, замененный сервером.

1 голос
/ 25 января 2010

Когда вы конвертируете в datetime, вы не выбираете формат - дата, время и datetime хранятся во внутреннем формате. Только когда вы конвертируете в строку (char, varchar, nvarchar), формат имеет значение для вывода. В других случаях формат выбирается SQL Server неявно, и он оказывается близким, но не идентичным 8601.

0 голосов
/ 25 января 2010
Приоритет оператора

, в вашем объединении все приводится к дате и времени, так как это первая строка. Если вы хотите T, вам нужно привести к varchar, но опять же вы не можете сделать это в союзе, так как смешанные типы данных будут приводиться к одному и тому же типу данных (если это возможно)

Сюда входит T, сама дата и время хранятся как 2 целых числа и не имеют ничего общего с этим

SELECT CONVERT(VARCHAR(30), GETDATE(), 126) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...