SQL приведение даты и времени - PullRequest
8 голосов
/ 25 марта 2010

В SQL Server 2005 почему:

PRINT Cast('' AS datetime)

Дисплей:

1 января 1900 12:00 AM * 1009

Я бы подумал, что это должно быть null?

Ответы [ 3 ]

9 голосов
/ 25 марта 2010

Это потому, что пустая строка '' не NULL. Если вы делаете:

select Cast(null AS datetime)

ВЫХОД:

-----------------------
NULL

(1 row(s) affected)

CAST и CONVERT (Transact-SQL)

Когда символьные данные, которые представляют только дата или только компоненты времени приведение к datetime или smalldatetime типы данных, неопределенное время компонент установлен на 00: 00: 00.000, и установлен неопределенный компонент даты до 1900-01-01.

6 голосов
/ 25 марта 2010

Пустая строка преобразуется в 0, которая затем преобразуется в дату эпохи.

В отличие от Oracle, SQL Server различает NULL и пустую строку.

1 голос
/ 25 марта 2010

Из эксперимента похоже, что SQL Server пытается привести к непосредственному приведению к DateTime, и при неудачном завершении попытки приводит к приведению к int, а затем к DateTime:

PRINT Cast('2009-1-1' AS datetime)
go
PRINT Cast('2009/1/1' AS datetime)
go
PRINT Cast('1.1' AS datetime)
go
PRINT Cast('1/2009/1' AS datetime)
go
PRINT Cast('' AS int)
go
PRINT Cast(' ' AS int)
go
PRINT Cast(0 AS datetime)
go
PRINT Cast('X' AS datetime)
go
PRINT Cast('X' AS int)

Выход:

Jan  1 2009 12:00AM
Jan  1 2009 12:00AM
Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.
Jan  1 2009 12:00AM
0
0
Jan  1 1900 12:00AM
Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.
Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value 'X' to data type int.
...