Существует множество форматов, поддерживаемых SQL Server - см. электронную книгу в MSDN Books on CAST и CONVERT . Большинство этих форматов зависят от настроек, которые у вас есть, поэтому эти настройки могут работать несколько раз, а иногда и нет.
Способ решения этого вопроса - использовать (слегка адаптированный) формат даты ISO-8601 поддерживаемый SQL Server - этот формат работает всегда - независимо от ваших языков SQL Server и настроек даты.
Формат ISO-8601 поддерживается SQL Server поставляется в двух вариантах :
YYYYMMDD
только для дат (без временной доли); обратите внимание здесь: никаких тире !, это очень важно! YYYY-MM-DD
НЕ является независимым от параметров dateformat на вашем SQL Server и не будет работать во всех ситуациях! или:
YYYY-MM-DDTHH:MM:SS
для дат и времена - обратите внимание: этот формат имеет тире (но они могут быть опущены ), а фиксированный T
в качестве разделителя между датой и временем вашей DATETIME
. Это справедливо для SQL Server 2000 и новее.
Итак, в вашем конкретном случае - используйте следующие строки:
insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');
и вы должны быть в порядке (обратите внимание: для этого вам необходимо использовать международный 24-часовой формат, а не 12-часовой формат AM / PM).
Альтернативно: если вы находитесь на SQL Server 2008 или новее , вы также можете использовать тип данных DATETIME2
(вместо обычного DATETIME
), и ваш текущий INSERT
будет работать без проблем! :-) DATETIME2
намного лучше и намного менее придирчивы к конверсиям - и в любом случае рекомендуют типы данных даты и времени для SQL Server 2008 или новее.
SELECT
CAST('02-21-2012 6:10:00 PM' AS DATETIME2), -- works just fine
CAST('01-01-2012 12:00:00 AM' AS DATETIME2) -- works just fine
Не спрашивайте меня почему эта целая тема настолько сложна и несколько запутанна - так оно и есть. Но в формате YYYYMMDD
вы должны быть в порядке для любой версии SQL Server и для любого языка и параметра dateformat на вашем SQL Server.