在 Impala 中将 YYYYMMDD 字符串转换为日期

Posted

技术标签:

【中文标题】在 Impala 中将 YYYYMMDD 字符串转换为日期【英文标题】:Convert YYYYMMDD String to Date in Impala 【发布时间】:2015-10-08 19:24:26 【问题描述】:

我在 Impala 中使用 SQL 来编写这个查询。我正在尝试将以 YYYYMMDD 格式存储的日期字符串转换为日期格式,以便运行如下查询:

SELECT datadate, 
       session_info
FROM database
WHERE datadate >= NOW() - INTERVAL 5 DAY
ORDER BY datadate DESC;

由于>= NOW() - INTERVAL 5 DAY 代码不适用于 YYYYMMDD 字符串,我想找到一种方法将其转换为适用于此类查询的日期格式。我的想法是它应该看起来像这样(基于关于其他 SQL 查询编辑器的类似问题),但它在 Impala 中不起作用:

SELECT datadate,
       session_info,
       convert(datetime, '20141008', 102) AS session_date
FROM database
WHERE session_date >= NOW() - INTERVAL 5 DAY
ORDER BY session_date DESC;

有人知道如何在 Impala 中执行此操作吗?

编辑:

我终于找到了解决问题的有效方法。使用CASTCONVERT 的配置的尝试都不能在Impala 中工作,但下面的查询解决了这个问题并且完全可操作,允许在包含字符串值的列上执行日期数学:

SELECT datadate,
       session_info
FROM database
WHERE datadate >= from_unixtime(unix_timestamp(now() - interval 5 days), 'yyyyMMdd')
GROUP BY datadate
ORDER BY datadate DESC;

【问题讨论】:

看看month(20141008)year(20141008) @vkp MONTH()YEAR() 函数适用于存储为日期或时间戳的 Impala 数据,但它似乎不适用于字符串数据。 查看文档cloudera.com/content/cloudera/en/documentation/cloudera-impala/… @vkp 这些函数似乎不适用于存储为 YYYYMMDD 字符串的日期。 使用演员表(datadate as char (8)) 【参考方案1】:

请参阅 [Link Updated 2020-08-24] 上的时间戳文字

https://docs.cloudera.com/cdp-private-cloud-base/7.1.3/impala-sql-reference/topics/impala-literals.html

您需要在字符串中添加破折号,以便 Impala 能够将其转换为日期/时间戳。你可以这样做:

concat_ws('-', substr(datadate,1,4), substr(datadate,5,2), substr(datadate,7) )

您可以在表达式中使用它来代替 datadate

【讨论】:

完美!谢谢【参考方案2】:

原生方式:

to_timestamp(cast(date_number AS STRING), 'yyyyMMdd')

【讨论】:

【参考方案3】:

要忽略小时/分钟/秒...,请使用from_timestamp,结果2020-01-01。 select from_timestamp(cast('2020-01-01 01:01:01.000000' as TIMESTAMP),'yyyy-MM-dd');

【讨论】:

以上是关于在 Impala 中将 YYYYMMDD 字符串转换为日期的主要内容,如果未能解决你的问题,请参考以下文章

在 Impala 中将连接的字符串转换为时间戳

Impala 日期到字符串的转换

hvie sql日期转换成字符串 格式为YYYYMMDD 怎么写?

如何在 Presto/Hive 中将日期格式 YYYY-MM-DD 转换为整数 YYYYMMDD?

如何在 SPARK SQL API 中将 YYYY-MM-DD 转换为 YYYYMMDD [重复]

将 DateTime 转换为格式为 YYYYMMDD 的字符串