我正在使用一个表格,该表格将日期值存储为整数,分别在“世纪”,“年”,“月”和“天”列下。 (“年”列仅获取年份的后两位数字,而“世纪”列仅在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”之类的日期。我该如何阻止这种行为?
答案 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
之类的日期。