Sql server 将从SQL Server日期列而不是1900-01-01返回空值的存储过程
我正在使用存储过程检索日期列并在ASP.NET web表单中显示结果。如果数据作为空值插入数据库,则结果显示日期列为Sql server 将从SQL Server日期列而不是1900-01-01返回空值的存储过程,sql-server,stored-procedures,Sql Server,Stored Procedures,我正在使用存储过程检索日期列并在ASP.NET web表单中显示结果。如果数据作为空值插入数据库,则结果显示日期列为1900-01-01。我需要它显示为空值 这是我的密码: SELECT *, CASE WHEN [DateField] = '1900-01-01' OR [DateField] IS NULL THEN '' END AS [DateField] FROM Table WHERE
1900-01-01
。我需要它显示为空值
这是我的密码:
SELECT
*,
CASE
WHEN [DateField] = '1900-01-01' OR [DateField] IS NULL
THEN ''
END AS [DateField]
FROM
Table
WHERE
MemberID = @MemberID
DateField
列应该返回一个空值,但它仍然显示日期1900-01-01您可以使用NULLIF
:
SELECT col1, col2, ..., NULLIF([DateField] , '19000101') AS [DateField]
FROM Table_name
WHERE MemberID = @MemberID
CASE
表达式返回的值具有返回值的数据类型优先级()。在您的案例中
有两种数据类型DateField
(我假设)是date
和'
,它是varchar(1)
<代码>日期的数据优先级高于varchar
,因此'
被隐式转换为日期
。并且(您可以使用选择CAST(''AS date);
)来测试这一点,因此返回的值是1900-01-01
与其使用空字符串,我建议返回NULL
。否则,您必须将[DateField]
列转换为varchar
;这是个坏主意。通过将案例
替换为:
NULLIF([DateField],'19000101')
能否提供列
[DateField]
的示例数据及其数据类型?另外,我注意到您正在执行Select*
,这将返回表中的所有列,你确定你没有查看从SELECT*
返回的列,而不是通过CASE
语句修改的列吗?列的类型是“date”,日期显示为1900-01-01请查看我最近添加的注释的第二部分。你是正确的,select*导致了该问题。当我按照卢卡斯的建议将其更改为列出字段时,它现在正在工作。谢谢。不客气。虽然你的回答是一个可能的解决方案,但我仍然不相信这是根本问题。OP从表中选择所有列,然后在Case语句中选择另一个日期,对select*和Case语句select使用相同的列名,因此在转换值时,谁知道它实际上从哪个列中提取值,因为它们具有相同的列名。@RyanWilson偶数(尽管有疑问)OP看错了专栏,我的答案仍然正确<代码>'作为日期
是1900-01-01
:如果您不相信,请尝试以下操作:选择CASE[DateCol]当'19000101'时,然后',否则[DateCol]结束于(值(转换(日期,'20181228')),(转换(日期,'19000101'))V(日期col)代码>返回值2018-12-28
和1900-01-01
,因为'
隐式转换为日期。问题将出现在他们数据集中的最后一列上,不管你认为他们是否在看错误的列。如果你注意到评论以及接受的答案,我是正确的。@RyanWilson接受的答案使用NULLIF
。。。(这与我这里的答案完全相同。)他们还指定了列,而不是使用SELECT*
,这将产生两个同名列。