当字段为null时,SQL Server Isnull返回1900-01-01


15

当DOB字段为空时,以下代码返回1900-01-01。我想要(并期望)它返回一个空字符串(''),但不是。我应该如何继续获得期望的结果?

isnull(convert(date,DOB,1),'')

5
您混淆的数据类型太多了。从本质上讲,您正在处理NULL约会SELECT CAST('' AS DATE)。什么是数据类型DOB
Mark Sinkinson

1
这是我要转换为日期的varchar数据类型
Juan Velez

5
我知道这是一篇过时的文章,但是值得一提的是,它似乎是您在尝试用SQL格式化数据,而不是让应用程序层为您做这些事情。99.9%的时间最好让应用程序层进行格式化。
Erik

Answers:


21

您无法获得空字符串,因为您DATE要从返回值类型ISNULL

根据MSDNISNULL

返回与check_expression相同的类型。如果将文字NULL作为check_expression提供,则返回replace_value的数据类型。如果将字面值NULL提供为check_expression且未提供replace_value,则返回int。

如果要检查值是否为NULL,则无需将其转换为日期,除非您想返回日期值(看起来好像不是)。

而是使用:

SELECT ISNULL( DOB , '')

哪个会回来

''

如果值为NULL

NULL日期是NULL(没有值)。另一方面,空字符串的计算结果为0,在SQL Server中为隐式整数,表示自以来的天数1900-01-01


-3

如果您希望在填充DOB时返回一个值,而在不填充DOB时删除空值。您可以尝试这样做,但DOB将是varchar而不是日期类型。

isnull(cast(cast(DOB as date)as varchar),'') as DOB   (SQL SERVER)

2
将a强制转换VARCHAR为a DATE再转换为a VARCHAR毫无意义。当您删除该废话时,您的答案便与接受的答案相同,但说明较少。
Erik

是的,在您的情况下没有意义,但是在我使用过的情况下,我以开始,datetime并且只需要输入日期YYYY-MM-DD。因此,随着date时间的流逝,我进行了投射。然后强制转换varchar允许使用该isnull功能。因此,我仍然获得填充记录的日期并删除空值。否则,我会得到1900-01-01 00:00:00.000
Elvis Candelaria 2015年

1
这不是我的情况,而是问题的情况。我相信这就是为什么您要收集不赞成票。您实际上是在尝试回答其他问题。
Erik

你是对的。我读错了。我的错。
Elvis Candelaria 2015年

-3

这会将NULL日期转换为空格。应用程序层(Excel)可以很好地处理空间

ISNULL (CONVERT(varchar(50), w.TRANSACTIONDT, 120), '')  as wTRANSACTIONDT

-3

只需创建一个视图

当year(DOB)<= 1900时创建CREATE VIEW test_view
AS
SELECT情况,然后返回null,否则DOB以DOB,sometext,id来自测试结束;

然后使用它代替原始表:从test_view中选择*


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.