2014-11-03 76 views
2

我已經在我的查詢如下:合併datetime值,並轉換爲varchar

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

我得到了一些空值,我需要凝聚爲空字符串。

我嘗試以下,其他的變化中,都沒有成功:

(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

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx – 2014-11-04 00:08:36

回答

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服務器日曆的歷元(其零點,1 January 1900 00:00:00.000)處理,該最終結果是

  • null日期時間值被視爲好像它是劃時代,'1 1900年1月00: 00:00.00'
  • 曆元的日期時間值被轉換爲一個空字符串
  • 日期時間值30 Dec 1899 00:00:00.000同樣轉換爲一個空字符串
  • 所有其他的日期時間值被轉換成一個字符串在ISO 8601短形式(YYYYMMDD )使用112轉換格式

隨着您的到期日期,null當前日期之前的到期日期和到期日期被表示爲空字符串;其他任何東西都轉換爲ISO 8601簡稱(YYYYMMDD)。

+0

這是完美的解。非常感謝你的幫助。 – 2014-11-04 19:16:52

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()時,你應該總是包括長度。默認長度因上下文而異,取決於它會導致意外 - 並且很難找到 - 錯誤。

編輯:

對於結束日期,這是相同的想法:

(情況下,當clientplans.END_DATE> =流延(GETDATE()作爲日期) 然後轉換(VARCHAR(255), clientplans.END_DATE,112) 完)作爲POLICY_EXP_DATE

+0

+1 on varchar length – 2014-11-04 00:15:35

+0

工作正常對於開始日期,但即時過期日期使用相同的邏輯。我需要用''(case clientplans.END_DATE 2014-11-04 00:22:58