将9999-12-31 00:00:00.000转换为null失败

时间:2012-10-12 02:44:43

标签: sql sql-server

此查询不起作用:

(CASE WHEN CONVERT(VARCHAR(8),Time,3) IN ('31/12/99') THEN 'NA' ELSE Time END)

我得到了

  

从字符串

转换日期和/或时间时转换失败

3 个答案:

答案 0 :(得分:1)

如果您确实想要 NULL(而不是'NA'),那么您可能应该使用NULLIF

SELECT NULLIF(time,'99991231')

我假设您的SQL Server配置了2位数年份截止值,因此它将99年解释为1999。如果您考虑了不同的年份99,请将1999更改为您的想法。


重新阅读你的头衔,你想要使用的是9999年,而不是1999年(也不是2099年) - 在这种情况下,你真的应该使用四位数年份。< / p>


如果time可能包含时间组件和日期,那么可能需要CASE - 但将比较作为datetime值进行比较仍然更好字符串:

CASE WHEN DATEADD(day,DATEDIFF(day,0,Time),0) = '99991231' THEN NULL ELSE Time END

正如@KaR指出的那样 - 如果您想要文字'NA'而不是NULL,那么您需要将Time转换为字符串 - CASE < em> expression 只能有一个返回类型,如果必须在datetimevarchar之间进行选择,它将选择前者。

答案 1 :(得分:0)

问题是你的案例查询返回两种不同的类型,它们是:

  • 'NA'是VarChar和
  • [时间],这是一个DateTime。

因此,为了解决此问题,您应该将[Time]作为VarChar类型返回。

请尝试以下代码:

CASE WHEN CONVERT(VARCHAR(8), [Time], 3) IN ('31/01/12') THEN 'NA' ELSE CONVERT(VARCHAR(8), [Time], 3) END

答案 2 :(得分:0)

尝试以下代码......

declare @t1 table(t1 DATETIME)
insert into @t1(t1)
select '9999-12-31 00:00' UNION ALL
select '01-04-2012 11:20' union all
select '9999-12-31 10:00' 
select case when dateadd(dd,datediff(dd,0,t1),0) not in('9999-12-31') then t1 end date from @t1