Вам необходимо ознакомиться с MSDN Books Online - тема: CAST and CONVERT .
Здесь отображаются все возможные поддерживаемые форматы даты, например,
CONVERT(VARCHAR(50), GETDATE(), 112)
преобразует сегодняшнюю дату в формат ISO, и вы получите 20110707
в качестве вывода.
Для максимальной совместимости я бы порекомендовал формат даты ISO-8601:
YYYYMMDD
или
YYYY-MM-DDTHH:MM:SS
Те, которые всегда работают, всегда могут быть преобразованы, независимо от даты вашего SQL Server, региональных и языковых настроек ...
Обновление:
Преобразование существующих строк в DATE
или DATETIME
сильно зависит от ваших языковых / региональных настроек:
DECLARE @string1 VARCHAR(25) = '10.7.2010'
DECLARE @string2 VARCHAR(25) = '7/11/2010 7:36:55 AM'
DECLARE @string3 VARCHAR(25) = '7/13/2010 3:33:45 PM'
SET DATEFORMAT MDY
SELECT
CAST(@string1 AS DATE),
CAST(@string2 AS DATETIME),
CAST(@string2 AS DATETIME)
Результат здесь:
2010-10-07 2010-07-11 07:36:55.000 2010-07-13 07:36:55.000
Даты интерпретируются как7 октября 2010 г., 11 июля 2011 г. и 13 июля 2010 г.
SET DATEFORMAT dmy
SELECT
CAST(@string1 AS DATE),
CAST(@string2 AS DATETIME)
Результат здесь:
2010-07-10 2010-11-07 07:36:55.000
Даты интерпретируются как 10 июля 2010 г. и 7 ноября 2011 г.
И , конечно , конвертируя @string3
в дату с этими настройкамипотерпит неудачу, так как он пытается интерпретировать его как 7-й из 13-го месяца ..... а 13-го месяца нет .....
Из-за таких неясностей я бы рекомендовал всегда использовать ISO-8601 форматы, которые понятны, стандартизированы, всегда работают, и всегда определены какая дата действительно представлена.
Обновление # 2 :
Конечно, вы также можете использовать функцию проверки ISDATE()
, если данную строку можно интерпретировать как действительную дату:
SELECT DateStr, ISDATE(DateStr) FROM dbo.YourTable
В случае SET DATEFORMAT DMY
, строковое значение '7/13/2010 3:33:45 PM'
будет признан недействительным:
SET DATEFORMAT DMY
SELECT ISDATE('7/13/2010 3:33:45 PM')
возвращает 0
в качестве значения.