2010-03-25 2 views

ответ

5

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

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

9

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

select Cast(null AS datetime) 

ВЫВОД:

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

(1 row(s) affected) 

CAST and CONVERT (Transact-SQL)

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

1

Из экспериментов, он выглядит как 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. 
+0

этот тест показывает цитату BOL из моего ответа в действии: 'select Cast ('1/1/2010' AS datetime) как defaultTime, Cast ('1: 23: 45.678' AS datetime) как defaultDate, Cast ('' AS datet ime) как defaultDateTime'. если время не задано, по умолчанию установлено значение «00: 00: 00 000', если дата не указана, по умолчанию« 1/1/1900 » –