Presto SQl中使用date_format()和date_parse()遇到的问题

在使用Presto进行数据查询时,作者发现使用date_parse()函数设置日期范围可能导致数据缺失。通过调整函数使用方式或改用date_format(),可以避免这一问题。正确的方法是确保时间范围包括目标日期的全天,而不仅仅是开始时刻。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天在Presto中查数据,查出来数据不对,后来发现是我使用date_parse()函数有问题

我需要查2018年12月31号到2019年1月6号之间的数据,

我使用的时间过滤方式是

and behavior_datetime >= date_parse('12/31/2018', '%m/%d/%Y')
and behavior_datetime <= date_parse('01/06/2019', '%m/%d/%Y')

结果查出来的数据不对

临时也没多想,换成了date_format()来查就对了.过滤方式如下

and date_format(behavior_datetime,'%Y-%m-%d')>= '2018-12-31' 
and date_format(behavior_datetime,'%Y-%m-%d')<= '2019-01-06'

其实后来发现错误的原因是date_parse()是将参数中的时间转换成时间戳来比较的,那么 01/06/2019 实际上是转换成  01/06/2019 00;00:00 再转成时间戳的

我的时间区间小于01/06/2019 00;00:00 这个时间戳, 其实就没取到1月6号这一天的时间

比较条件换成小于1月7号零点的时间(如下)

and behavior_datetime >= date_parse('12/31/2018', '%m/%d/%Y')
and behavior_datetime < date_parse('01/07/2019', '%m/%d/%Y')

就没有任何问题了

转载于:https://www.cnblogs.com/qooweds/p/10443476.html

Presto SQL中,处理日期时间的函数可能与你提供的语法有所不同,因为Presto SQL使用不同的函数来处理日期。下面是将你提供的SQL片段转换为Presto SQL语法的一个例子: 假设 `stat_dt` 是一个字符串格式的日期,你想得到上一个工作日或者当前日期的前一天(如果今天是工作日的话)。在Presto中,可以使用 `current_date` 获取当前日期,`date_add` 或者 `date_sub` 来进行日期的加减操作。为了处理工作日逻辑,可以使用 `dayofweek` 函数来确定当前是周几,并根据需要进行调整。 以下是转换后的Presto SQL代码示例: ```sql WITH date_helper AS ( SELECT CASE WHEN dayofweek(current_date) = 1 THEN date_add('day', 2, current_date - INTERVAL '1' day) -- 如果今天是周日,则取前天 WHEN dayofweek(current_date) = 7 THEN date_add('day', 1, current_date) -- 如果今天是周六,则取明天 ELSE current_date - INTERVAL '1' day -- 其他情况取前一天 END AS prev_day, current_date as today ) SELECT CASE WHEN to_date(stat_dt) = last_day(to_date(stat_dt, 'yyyyMMdd')) THEN date_format(last_day(to_date(stat_dt, 'yyyyMMdd')) - INTERVAL '1' day, 'yyyyMMdd') WHEN stat_dt = date_format(current_date, 'yyyyMMdd') THEN date_format(prev_day, 'yyyyMMdd') ELSE stat_dt END as adjusted_stat_dt FROM your_table_name ``` 请注意,这里使用了 `date_format` 函数来格式化日期,并且假设 `stat_dt` 是一个可以直接转换为日期的字符串。此外,`your_table_name` 需要被替换为你实际的表名。 在使用上述代码之前,请根据你的实际需求数据情况进行相应的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值