如何从当前日期中减去一天然后在 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 中转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

从 hive 中的日期字段中减去 n 个月

如何从/到日期减去/添加天数?

hive时间差

如何在 TypeScript 中从日期中减去天数

如何使用 postgresql/netezza 从日期时间中减去天数或月数

java - 如何从Java中存储日期的给定字符串字段中减去X天? [复制]