日期转换“超出范围的值”错误,在WHERE子句下转换日期

时间:2020-02-11 19:06:05

标签: sql sql-server sql-server-2017

我正在使用一个表格,该表格将日期值存储为整数,分别在“世纪”,“年”,“月”和“天”列下。 (“年”列仅获取年份的后两位数字,而“世纪”列仅在2000年之前的年份和2000年之后的年份分别从0到1。)

我正在尝试过滤特定日期之后的数据。这些列必须转换为单个日期或日期时间值,以便可以更改报告参数。现在,WHERE子句看起来像这样:

WHERE convert(datetime, CAST( ((19 + Table.Century) * 100 + Table.Year) as varchar) + '-' +  (Table.Month as varchar) + '-' + CAST(Table.Day as varchar), 121) > Convert(datetime,'2020-01-01', 121)

但是,当我尝试运行查询时,它总是会引发错误:

将varchar数据类型转换为datetime数据类型会导致超出范围的值。

问题似乎出在“月”列中。如果我将任何30天的月份(或二月)替换为Table.Month值,则会引发错误。 31天的工作正常。但是,数据本身没有出界日期。另外,该语句运行良好,并且如果将其放在SELECT语句中也不会中断。

给人的印象是,WHERE语句正在对每个可能的Year值对每个可能的Day值对每个可能的Month值进行评估,等等,最终检查了诸如“ 2020-02-30”之类的日期。我该如何阻止这种行为?

1 个答案:

答案 0 :(得分:0)

使用<a> <img src="https://images.wikidi.net/crop/172x242/http://f2.fsm.wikidi.com/af/ad/yb/e0d20df22741de9c3480e691bc7a3a41efceddcd.jpg" > </a>

datefromparts()

也就是说,您可能有无效的值。您应该调查以下内容:

where datefromparts(1900 + century * 100 + year, month, day) > '2020-01-01'

之所以可行,是因为SQL Server擅长解释诸如select century, year, month, day from t where try_convert(concat(1900 + century * 100 + year, '-' month, '-', day) ) is null 之类的日期。

相关问题