Sql Coalesce和nullif处理子字符串和null值

Sql Coalesce和nullif处理子字符串和null值,sql,sql-server-2016,Sql,Sql Server 2016,我使用COALESCE和NULLIF处理字段中的datetime,但仍然在空字符串的输出中获取子字符串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

我使用COALESCE和NULLIF处理字段中的datetime,但仍然在空字符串的输出中获取子字符串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

Canceltime字段中的示例数据:

取消时间

Blank
19/05/19 22:46:05

错误输出:

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

预期产出:

Blank
2019/05/19 22:46:05

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

您可以使用
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
。使用适当的数据类型,如
DATETIME
SMALLDATETIME
DATETIME2
您可以使用
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
。使用适当的数据类型,如
DATETIME
SMALLDATETIME
,或
DATETIME2
,我建议只以原始格式作为日期/时间处理。但是在你的情况下,你能不能预先加上
'20'

select '20' + canceltime

我建议只以日期/时间的原生格式处理事情。但是在你的情况下,你能不能预先加上
'20'

select '20' + canceltime

您应该提供示例数据并描述要实现的逻辑。适当的数据库标记也很有用。我已经提供了示例数据,如果这有助于@GordonLinoffWhat数据库引擎?是SQL Server吗,Sybase?@TheImpaler SQL Server 2016根据经验,避免将日期/时间数据存储为
VARCHAR
。改为使用
DATETIME
。您应该提供示例数据并描述要实现的逻辑。适当的数据库标记也很有用。我已经提供了示例数据,如果这有助于@GordonLinoffWhat数据库引擎?是SQL Server吗,Sybase?@TheImpaler SQL Server 2016根据经验,避免将日期/时间数据存储为
VARCHAR
。请改用
DATETIME
。谢谢。我很好奇如何在不使用CASE的情况下使用COALESCE和NULLIF使其工作。有可能吗?
COALESCE()
检测空值。但是,表中似乎根本没有空值,而是空的
VARCHAR
s(长度为0的字符串)
COALESCE()
对它们没有任何作用。我可以用什么来代替COALESCE来检测空值呢?在任何情况下,数据操作都是粗略的,您正在打一场失败的仗。您最好尽快开始使用正确的数据类型。谢谢。我很好奇如何在不使用CASE的情况下使用COALESCE和NULLIF使其工作。有可能吗?
COALESCE()
检测空值。但是,表中似乎根本没有空值,而是空的
VARCHAR
s(长度为0的字符串)
COALESCE()
对它们没有任何作用。我可以用什么来代替COALESCE来检测空值呢?在任何情况下,数据操作都是粗略的,您正在打一场失败的仗。您最好尽快开始使用正确的数据类型。