0

此查询不起作用:

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

我明白了

从字符串转换日期和/或时间时转换失败

4

3 回答 3

1

如果你真的想要 NULL(而不是'NA'),那么你可能应该使用NULLIF

SELECT NULLIF(time,'99991231')

我假设您的 SQL Server 配置了 2 位数的年份截止值,因此它将年份解释991999. 如果您有不同的一年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 之间进行选择datetimevarchar它将选择前者。

于 2012-10-12T06:31:18.473 回答
0

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

  • 'NA' 是 VarChar 和
  • [时间] 这是一个日期时间。

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

试试下面的代码:

CASE WHEN CONVERT(VARCHAR(8), [Time], 3) IN ('31/01/12') THEN 'NA' ELSE CONVERT(VARCHAR(8), [Time], 3) END
于 2012-10-12T03:04:46.680 回答
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
于 2012-10-12T06:48:24.973 回答