select from_unixtime(unix_timestamp()) as default_format
,from_unixtime(unix_timestamp(),'YYYY-MM-DD') as wrong_format
,from_unixtime(unix_timestamp(),'yyyy-MM-dd') as right_format
;
with t as (select stack(7,'27','28','29','30','31','32','33') as dy)
select t.dy
,from_unixtime(unix_timestamp(concat('2017-02-',t.dy),'yyyy-MM-dd'),'yyyy-MM-dd') as dt
from t
;
with t as (select stack(5,'10','11','12','13','14') as mn)
select t.mn
,from_unixtime(unix_timestamp(concat('2017-',t.mn,'-01'),'yyyy-MM-dd'),'yyyy-MM-dd') as dt
from t
;
with t as (select '20019999' as dt)
select dt
,from_unixtime(unix_timestamp(dt,'yyyyMMdd'),'yyyyMMdd') as double_converted_dt
,case
when from_unixtime(unix_timestamp(dt,'yyyyMMdd'),'yyyyMMdd') = dt
then 'Good'
else 'Bad'
end as dt_status
from t
;
1条答案
按热度按时间vdzxcuhz1#
首先,你使用了错误的格式
第二,没有验证日期部件范围。
如果你把一天的部分增加1,它会把你转到第二天。
如果您将月份部分增加1,它会将您转发到下一个月。
即使使用cast,验证也只在零件范围内进行,而不是在日期本身。
以下是实现目标的方法: