我有一个查询,其中我连接了日、月、年的各个列,以形成格式为MM/DD/YYYY的日期,然后使用新连接的列获取12/16/2021(Dec 16 2021)之后的记录。
我已经尝试了多次比较日期,但没有运气。下面是我的问题:
select x.* from
(
Select date(to_date(p.PLDRM || '/' || p.PLDRD || '/' || p.PLDRY, 'MM/DD/YYYY')) as Departure_Date,
date(to_date(p.PLARM || '/' || p.PLARD || '/' || p.PLARY, 'MM/DD/YYYY')) as Arrival_Date,
date(to_date(p.PLLCM || '/' || p.PLLCD || '/' || p.PLLCY, 'MM/DD/YYYY')) as Change_Date,
p.*
from post_table p
) x
where x.change_date > date('12/16/2021')
这将导致错误-日期、时间或时间戳字符串中的值无效
3条答案
按热度按时间omqzjyyz1#
我敢打赌,您的表中有一些无效数据...
例如,月份为0,或〉= 13。
另一个可能的错误是MM/DD为02/30或02/31,甚至是02/29(非闰年)。
最好的办法是定义一个用户定义函数(UDF)来为您构建日期,这样您就可以为无效日期返回NULL。
或者,您可以检查特定的无效日期,并针对您的用例返回有效值。例如,02/30 ==〉02/28或02/29(如果在闰年)。
我手边没有任何代码示例,但如果有时间,我会把一些东西放在一起,然后编辑这个答案。
UDF示例
hiz5n14c2#
更新:
当查询PLLCM、PLLCD、PLLCY的不同值时,我发现其中一个值是“0”(可能是为了避免出现NULL)。
在调整查询以避免这三列中出现“0”后,查询成功返回结果。
mcdcgff03#
与@Charles的想法相同,但使用了一个过程,因为我当时不能在函数体中使用处理程序(还没有检查现在是否可以使用):
事实证明,这可以大大简化这些天:
FWIW,我有几个类似的函数用于其他类型,如XML。当必须清理临时数据时,它真的很方便。