此查询不起作用:
(CASE WHEN CONVERT(VARCHAR(8),Time,3) IN ('31/12/99') THEN 'NA' ELSE Time END)
我得到了
从字符串
转换日期和/或时间时转换失败
答案 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 只能有一个返回类型,如果必须在datetime
和varchar
之间进行选择,它将选择前者。
答案 1 :(得分:0)
问题是你的案例查询返回两种不同的类型,它们是:
因此,为了解决此问题,您应该将[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