合并日期时间值并转换为varchar

时间:2014-11-03 23:46:02

标签: sql sql-server

我的查询中有以下内容:

( 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?

2 个答案:

答案 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同样也会转换为空字符串
  • 使用112转换格式将所有其他日期时间值转换为ISO 8601简短格式(YYYYMMDD)中的字符串

在您的到期日期之前,null到期日期和当前日期之前的到期日期表示为空字符串;其他任何东西都转换为ISO 8601短格式(YYYYMMDD)。