我将日期存储为 [27/Feb/2016:00:24:31 +0530]
。
我想要 27/Feb/2016
中的日期格式,并且还想按它排序。
我试过了 this解决方案,但它以 2016-02-27
形式返回,并且也正确排序。
SELECT
TO_DATE( FROM_UNIXTIME( UNIX_TIMESTAMP( SUBSTR( time, 2, 11), 'dd/MMM/yyyy' ))) AS real_date,
url
FROM cleanned_logs
ORDER BY real_date ASC;
为了获得所需的格式,我尝试使用 date_format()
函数。它在 1.2.1 中不可用,所以我从 1.0.1 切换到它。
SELECT
DATE_FORMAT( FROM_UNIXTIME( UNIX_TIMESTAMP( SUBSTR(time,2,11),'dd/MMM/yyyy')), 'dd/MMM/yyyy') AS real_date,
url
FROM cleanned_logs
ORDER BY real_date ASC;
它给了我想要的格式,但没有正确排序。
更新:
SELECT display_date,COUNT(url) FROM
(
SELECT SUBSTR(time,2,11) as display_date,url,UNIX_TIMESTAMP(SUBSTR(time,2,11),'dd/MMM/yyyy') as real_date FROM cleanned_logs order by real_date ASC
)b group by real_date;
在分组中产生问题。这里配置单元在 select 子句中期望 real_date
。
最佳答案
我认为您将数据的格式或显示与基础数据本身混淆了。如果表将日期存储为以一种方式格式化的字符串,[27/Feb/2016:00:24:31 +0530]
它仍然是一个字符串,并且字符串的排序与实际日期、时间戳不同, 或数字。
理想情况下,您会将日期存储为 TIMESTAMP
数据类型。当你想显示它时,使用 DATE_FORMAT
,当你想对其排序时,在基础数据字段上使用 ORDER BY
。因此,如果您的字段类型为 TIMESTAMP
,称为 some_time
,您可以查询为
SELECT DATE_FORMAT(some_time, 'dd/MMM/yyyy')
FROM some_table
WHERE some_condition
ORDER BY some_time DESC
如果您遇到存储为有效时间戳值的字符串,那么您可能需要做更多的工作
SELECT SUBSTR(some_time, 2, 11)
FROM some_table
WHERE some_condition
ORDER BY unix_timestamp(SUBSTR(some_time,2,11), 'dd/MMM/yyyy'))
第二个选项根据需要显示值,并按数字排序——unix 时间戳只是一个数字,但它与日期的顺序相同,因此无需将其进一步转换为实际日期。
关于date - hive cast string to date in 'dd/MMM/yyyy' format order by and group by issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35668624/