此查询不起作用:
(CASE WHEN CONVERT(VARCHAR(8),Time,3) IN ('31/12/99') THEN 'NA' ELSE Time END)
我明白了
从字符串转换日期和/或时间时转换失败
此查询不起作用:
(CASE WHEN CONVERT(VARCHAR(8),Time,3) IN ('31/12/99') THEN 'NA' ELSE Time END)
我明白了
从字符串转换日期和/或时间时转换失败
如果你真的想要 NULL
(而不是'NA'
),那么你可能应该使用NULLIF
SELECT NULLIF(time,'99991231')
我假设您的 SQL Server 配置了 2 位数的年份截止值,因此它将年份解释99
为1999
. 如果您有不同的一年99
,请改变1999
您的想法。
重新阅读你的标题后,你想使用 9999 年,而不是 1999 年(也不是 2099 年)——在这种情况下,你真的应该使用四位数的年份。
如果time
可能有时间组件和日期,那么CASE
可能是有保证的 - 但将比较作为datetime
值而不是字符串进行比较仍然会更好:
CASE WHEN DATEADD(day,DATEDIFF(day,0,Time),0) = '99991231' THEN NULL ELSE Time END
正如@KaR 指出的那样——如果你想要文本'NA'
而不是NULL
,那么你需要转换Time
为字符串——CASE
表达式只能有一个返回类型,如果它必须在 and 之间进行选择datetime
,varchar
它将选择前者。
问题是您的案例查询返回两种不同的类型,它们是:
因此,要解决此问题,您应该将 [Time] 作为 VarChar 类型返回。
试试下面的代码:
CASE WHEN CONVERT(VARCHAR(8), [Time], 3) IN ('31/01/12') THEN 'NA' ELSE CONVERT(VARCHAR(8), [Time], 3) END
试试下面的代码....
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