Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将从SQL Server日期列而不是1900-01-01返回空值的存储过程_Sql Server_Stored Procedures - Fatal编程技术网

Sql server 将从SQL Server日期列而不是1900-01-01返回空值的存储过程

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

我正在使用存储过程检索日期列并在ASP.NET web表单中显示结果。如果数据作为空值插入数据库,则结果显示日期列为
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*
,这将产生两个同名列。