SQL cast datetime

в SQL Server 2005 почему:

PRINT Cast('' AS datetime)

дисплей:

1 января 1900 12: 00

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

3 ответов


пустая строка приводится к 0 который позже приведен к дате era.

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


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

select Cast(null AS datetime)

выход:

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

(1 row(s) affected)

приведение и преобразование (Transact-SQL)

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


из экспериментов похоже, что 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.