合并和nullif处理子字符串和null值

时间:2019-05-21 23:19:55

标签: sql sql-server-2016

我正在将COALESCE与NULLIF一起使用来处理字段中的日期时间,但仍然在输出中得到空字符串的subtring vlaues

select coalesce(nullif('20' + LEFT(SUBSTRING(cancelTime,1,8),2)
+ '/' + LEFT(RIGHT(SUBSTRING(canceltime,1,8),5),2) + '/' +  RIGHT(SUBSTRING(cancelTime,1,8),2)+' '+
left(SUBSTRING(cancelTime,10,17),2)
+ ':' + right(left(SUBSTRING(cancelTime,10,17),5),2) + ':' +  right(SUBSTRING(cancelTime,10,17),2),''),'') as CancelDate
  FROM [dbo].[test]

逻辑:我想在字段中有日期时间的任何时候显示日期和时间,如果没有值,则将其显示为空白。例如,当值为19/05/19 22:46:05时,则显示此2019/05/19 22:46:05。

“取消时间”字段中的示例数据:

取消时间

Blank
19/05/19 22:46:05

错误输出:

20 / /  ::
2019/05/19 22:46:05

预期输出:

Blank
2019/05/19 22:46:05

我期望20 / / ::在输出中为空白。

2 个答案:

答案 0 :(得分:0)

您可以使用CASE来识别“不良”值并在特定情况下产生结果。例如:

select
  case when cancelTime 
      like '[0-9][0-9]/[0-9][0-9]/[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]'
    then ... -- your long formatting formula here
    else '' -- blank if it doesn't match a date/time value
  end as CancelDate  
from [dbo].[test]

无论如何,根据经验,请避免将日期/时间数据存储为VARCHAR。使用适当的数据类型,例如DATETIMESMALLDATETIMEDATETIME2

答案 1 :(得分:0)

我建议只将其本机格式作为日期/时间处理。但是,就您而言,您是否只能在'20'之前添加前缀?

select '20' + canceltime