SQL Server поддерживает множество форматов - см. MSDN Books Online на 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, а также любые настройки языка и даты в вашем SQL Server.