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

Sql 将9999-12-31 00:00:00.000转换为空失败,sql,sql-server,Sql,Sql Server,此查询不起作用: (CASE WHEN CONVERT(VARCHAR(8),Time,3) IN ('31/12/99') THEN 'NA' ELSE Time END) 我明白了 从字符串转换日期和/或时间时转换失败 问题在于您的案例查询返回两种不同的类型,它们是: “NA”是VarChar和 [时间]这是一个日期时间 所以要解决这个问题,您应该以VarChar类型返回[Time] 请尝试以下代码: CASE WHEN CONVERT(VARCHAR(8), [Time], 3) I

此查询不起作用:

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

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


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

  • “NA”是VarChar和
  • [时间]这是一个日期时间
所以要解决这个问题,您应该以VarChar类型返回[Time]

请尝试以下代码:

CASE WHEN CONVERT(VARCHAR(8), [Time], 3) IN ('31/01/12') THEN 'NA' ELSE CONVERT(VARCHAR(8), [Time], 3) END
如果您确实想要
NULL
(而不是
'NA'
),那么您可能应该使用

我假设您的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
转换成一个字符串-a
CASE
表达式只能有一个返回类型,如果它必须在
datetime
varchar
之间进行选择,它将选择前者。

尝试下面的代码

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

我明白了,谢谢。但是,它不适用于'31/12/99',你知道为什么吗?它会抛出什么错误?我已尝试将日期更改为'31/12/99',效果良好。也许你能把表结构和完整的查询发给我。我试着把问题弄清楚一点,但我不能完全确定我是否答对了。请查看、还原或编辑您认为合适的代码。发布代码时,请突出显示代码并使用
{}
按钮-它保留换行符并添加语法突出显示。“如果
时间
可能有时间成分和日期,则
案例
可能有保证”-不确定您的意思。在这种情况下也可以使用NULLIF:
NULLIF(DATEADD(day,DATEDIFF(day,0,Time),0),'99991231')
。无论如何,
9999-12-31
日期似乎不太可能与时间组件一起使用,因此您的第一个
NULLIF
似乎就足够了。@AndriyM-但在这种情况下,
NULLIF
返回的值也不会有时间组件-而
case
,如果它返回的是
time
列,正在完整地返回它。啊,事实上,如果您返回的是
time
,而不是
DATEADD(…)
。你说得对,谢谢你的更正。
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