如何从当前日期中减去一天然后在 Hive 中转换为字符串
Posted
技术标签:
【中文标题】如何从当前日期中减去一天然后在 Hive 中转换为字符串【英文标题】:How to subtract one day from current date then convert to string in Hive 【发布时间】:2016-10-21 13:24:28 【问题描述】:情况就是这样。我正在尝试使用选择语法来获取前一天的数据(今天我们有 21.10,因此我应该有 20.10 日期查询的数据将成为 Talend 中 ETL 过程的一部分,所以我不能简单地做where date = '2016-10-20'
)
问题是数据源中的所有列都是 VARCHAR 或 STRING 类型 - 日期也是。源代码在 Hive Hadoop 上。
我的代码:
select
cast(to_date(from_unixtime(unix_timestamp(dzien ,'yyyyMMdd'), 'yyyy-MM-dd')) as date),
count(ns_utc) as ILOSC_ODSLON
from portal.portal_data
where
portal_data.opl_ev_ty is null
and portal_data.opl_ev_as is null
and cast(to_date(from_unixtime(unix_timestamp(dzien ,'yyyyMMdd'), 'yyyy-MM-dd')) as date) = CAST(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP()))as date) - interval '1' day
GROUP BY
cast(to_date(from_unixtime(unix_timestamp(dzien ,'yyyyMMdd'), 'yyyy-MM-dd')) as date)
使用该代码查询除了列名之外什么都不返回。问题可能出在这部分= CAST(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP()))as date) - interval '1' day
。
我做了一些测试。当我运行这个查询时
select CAST(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP()))as date) - interval '1' day
结果是 2016-10-20 00:00:00.0
和部分 00:00:00.0 可能会破坏我的查询,因为在主查询而不是 = CAST(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP()))as date) - interval '1' day
时,我设置条件 = '2016-10-20'
结果符合预期。
你能指导我如何解决这个问题吗?
我使用的是 SQL Workbench 而不是 Hue
【问题讨论】:
我不确定我是否正确理解了您的问题。从where子句中的unix时间戳减去一天中的秒数(43200)然后try-CAST(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP()-43200))作为日期) 【参考方案1】:解析日期后,使用 hive 中可用的 date_sub
函数
date_sub(string startdate, int days)
date_sub('2008-12-31', 1) = '2008-12-30'
您甚至可以点击下面的链接。
https://www.qubole.com/resources/cheatsheet/hive-function-cheat-sheet/
【讨论】:
【参考方案2】:DATE_SUB 在 HIVE 2.1.0 中可用
date_sub(date/timestamp/string startdate, tinyint/smallint/int days)
减去开始日期的天数:date_sub('2008-12-31', 1) = '2008-12-30'。
在 Hive 2.1.0 (HIVE-13248) 之前,返回类型是 String,因为在创建方法时不存在 Date 类型。
【讨论】:
【参考方案3】:问题是您尝试从日期中减去一天的方式。我建议从 where 子句中的 unix 时间戳中减去一天中的秒数(86400)-
CAST(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP()-86400))as date)
【讨论】:
类似的想法,但保持时间的精确性。在这种情况下,我减去一小时cast( (cast(yourtimestampcolumn as bigint)-1*3600) as timestamp)
【参考方案4】:
对于版本 >= Hive 2.0 试试这个:
select current_date;
然后试试这个:
select date_sub(current_date, 1);
它应该给你当前日期减去 1 天。
【讨论】:
【参考方案5】:如果 Hive 版本不支持date_sub
,您可以破解date_add
并将-1
作为间隔参数。
select current_date as curr_date , date_add(current_date,-1) curr_minus_1;
curr_date | curr_minus_1
2020-03-03 | 2020-03-02
【讨论】:
【参考方案6】:cast(date_sub(CURRENT_DATE, 1) as string)
【讨论】:
您可能需要添加更多解释,否则您的答案可能会被删除。以上是关于如何从当前日期中减去一天然后在 Hive 中转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章