情况就是这样.我正在尝试使用select语法从最后一天获取数据(今天我们有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)
Run Code Online (Sandbox Code Playgroud)
使用该代码查询返回没有exept列名称.问题可能出在这一部分= 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
Run Code Online (Sandbox Code Playgroud)
结果是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'结果是预期的.
你能指导我如何解决这个问题吗?
而不是Hue我正在使用SQL Workbench
lon*_*tar 19
解析日期后,使用date_sub配置单元中可用的功能
date_sub(string startdate, int days)
date_sub('2008-12-31', 1) = '2008-12-30'
Run Code Online (Sandbox Code Playgroud)
您甚至可以点击以下链接.
https://www.qubole.com/resources/cheatsheet/hive-function-cheat-sheet/
DATE_SUB在HIVE 2.1.0中可用
date_sub(date/timestamp/string startdate, tinyint/smallint/int days)
Run Code Online (Sandbox Code Playgroud)
减去开始日期的天数:date_sub('2008-12-31',1)='2008-12-30'。
在Hive 2.1.0(HIVE-13248)之前,返回类型为String,因为创建方法时不存在Date类型。
问题是您尝试从日期中减去一天的方式。我建议从unix时间戳中减去其中一天中的秒数(86400)-
CAST(TO_DATE(FROM_UNIXTIME(UNIX_TIMESTAMP()-86400))as date)
Run Code Online (Sandbox Code Playgroud)
对于版本 >= Hive 2.0 试试这个:
select current_date;
Run Code Online (Sandbox Code Playgroud)
然后试试这个:
select date_sub(current_date, 1);
Run Code Online (Sandbox Code Playgroud)
它应该给你当前日期减去 1 天。
| 归档时间: |
|
| 查看次数: |
34421 次 |
| 最近记录: |