工作中遇到了一个问题,就是关于trino中的date_diff函数用来求两个timestamp类型(格式:2022-05-01 00:00:00)的时间相减后的天数,当时不知道,数据对不上,后来才发现是这个原因导致的。希望对大家有帮助。
请看示例:
示例1:这种情况没有问题,天数是对的
select date_diff('day',cast('2022-05-01 23:45:09' as TIMESTAMP),
cast('2022-05-03 23:56:31' as timestamp))
---------------结果:----------------
2
示例2:这种情况就不对了,求出来的天数的0
select date_diff('day',cast('2022-05-01 23:45:09' as TIMESTAMP),
cast('2022-05-02 03:56:31' as timestamp));
-------------结果:-----------------
0
有人认为这结果没有问题,是对的,就应该是0,这么说没有问题,因为考虑到小时,从小时算还不满24个小时,所以就没有到一天。但是,比如这么算:您是2021年10月20日租的房子,签的合同,是不是10月20日就生效了,房东会管你这个合同是10月20日几点签订的吗?不会对吧,那么2022年10月19日房子是不是最后一天了,2022年10月20日就是新合同的第一天,与上一份合同是不是差了一天呢?这么想不就有问题了吗??
结论:date_diff计算如示例2的情况是,会按小时去算,小时间隔为24小时的算间隔一天,不满24小时的算为间隔0天。
解决方案:转换为date类型,在相减,得到正确结果。
select date_diff('day',date(format_datetime(cast('2022-05-01 23:45:09' as TIMESTAMP),'yyyy-MM-dd')),
date(format_datetime(cast('2022-05-02 03:56:31' as timestamp),'yyyy-MM-dd')))
------------结果:------------------
1