2010-03-25 45 views

回答

5

将空字符串转换为0,然后将其输出到era日期。

Oracle不同,SQL Server区分了NULL和空字符串。

9

这是因为空字符串''不是NULL。如果你这样做:

select Cast(null AS datetime) 

OUTPUT:

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

(1 row(s) affected) 

CAST and CONVERT (Transact-SQL)

当代表 仅日期或仅时间部分字符数据 投给日期时间SMALLDATETIME 数据类型,联合国指定时间 组件设置为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报价:'选择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' – 2010-03-25 18:10:21