情况就是这样。我正在尝试使用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
答案 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)