如何从当前日期减去一天,然后在Hive中转换为字符串

时间:2016-10-21 13:24:29

标签: sql hadoop hive

情况就是这样。我正在尝试使用select语法从最后一天获取数据(今天我们有21.10因此我应该有20.10日期查询的数据将成为Talend中ETL过程的一部分所以我不能简单地做{{1 }}) 问题是数据源中的所有列都是VARCHAR或STRING类型 - 日期也是。来源是Hive Hadoop。

我的代码:

where date = '2016-10-20'

使用该代码查询返回任何exept列名称。问题可能在于此部分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 ,而00:00:00.0可能会破坏我的查询,因为在主查询中而不是2016-10-20 00:00:00.0我将条件= CAST(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP()))as date) - interval '1' day的结果与预期一致。< / p>

你能指导我如何解决这个问题吗?

而不是Hue我正在使用SQL Workbench

6 个答案:

答案 0 :(得分:17)

解析日期后,使用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/

答案 1 :(得分:7)

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类型。

答案 2 :(得分:4)

问题是你试图从date减去一天的方式。我建议从where子句中的unix时间戳中减去一天中的秒数(86400) -

CAST(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP()-86400))as date) 

答案 3 :(得分:2)

对于版本> = Hive 2.0 试试这个:

select current_date;

然后尝试:

select date_sub(current_date, 1);

它应该给您当前日期减去1天。

答案 4 :(得分:1)

如果Hive版本不支持date_sub,则可以入侵date_add并将-1作为interval参数传递。

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 

答案 5 :(得分:0)

cast(date_sub(CURRENT_DATE,1)as string)