我的查询中有以下内容:
( case
when clientplans.start_date='1899-12-30 00:00:00.000' then ''
else CONVERT(varchar,clientplans.START_DATE,112)
end
) as POLICY_EFF_DATE,
我得到一些NULL,我需要COALESCE来清空字符串。
我尝试了以下其他变体,但没有成功:
( case
when clientplans.start_date='1899-12-30 00:00:00.000' then ''
else COALESCE( CONVERT(varchar,clientplans.START_DATE,112) , '' )
end
) as POLICY_EFF_DATE,
如何摆脱NULL?
答案 0 :(得分:3)
你也可以颠倒逻辑:
(case when clientplans.start_date > '1899-12-30 00:00:00.000'
then CONVERT(varchar(255), clientplans.START_DATE, 112)
else ''
end) as POLICY_EFF_DATE,
注意:在SQL Server中使用varchar()
时,应始终包含长度。默认长度因上下文而异,具体取决于它可能导致意外 - 并且很难找到 - 错误。
编辑:
对于结束日期,它是相同的想法:
(客户计划的情况.END_DATE> =强制转换(getdate()作为日期) 然后转换(varchar(255),clientplans.END_DATE,112) 结束)作为POLICY_EXP_DATE
答案 1 :(得分:2)
我会做这样的事情:
select policy_eff_date = case coalesce(cp.start_date,'')
when '' then ''
when '1899-12-30 00:00:00.000' then ''
else convert(varchar , cp.start_date , 112 )
end ,
policy_exp_date = case sign( datediff(day,getdate(),coalesce(cp.end_date,'')) )
when -1 then ''
else convert(varchar,cp.end_date,112)
end ,
...
from clientplans cp
...
由于''
在SQL Server日历的时期(其零点1 January 1900 00:00:00.000
)处理,因此最终结果是
null
日期时间值被视为时代,即1900年1月1日00:00:00.00' 30 Dec 1899 00:00:00.000
同样也会转换为空字符串YYYYMMDD
)中的字符串在您的到期日期之前,null
到期日期和当前日期之前的到期日期表示为空字符串;其他任何东西都转换为ISO 8601短格式(YYYYMMDD
)。