Hive中的预处理日期错误

b91juud3  于 2021-06-26  发布在  Hive
关注(0)|答案(3)|浏览(400)

我正在运行以下查询:

select a.event_date,
    date_format(date_trunc('month', a.event_date), '%m/%d/%Y') as date
from monthly_test_table a
order by 1;

输出:

2017-09-15 | 09/01/2017
 2017-10-01 | 09/30/2017
 2017-11-01 | 11/01/2017

谁能告诉我为什么日期“2017-10-01”在使用date\u trunc后显示为“09/30/2017”。
提前谢谢。。。!

7cjasjjr

7cjasjjr1#

你可以用 date_add 用逻辑减去1天(你的约会)来复制 trunc .
例如:

2017-10-01 - day('2017-10-01') is 1 and you add 1-1=0 days 
2017-08-30 - day('2017-08-30') is 30 and you add 1-30=-29 days

我最近也遇到了同样的问题,并采用了这种逻辑。

date_add(from_unixtime(unix_timestamp(event_date,'yyyy-MM-dd'),'yyyy-MM-dd'),
         1-day(from_unixtime(unix_timestamp(event_date,'yyyy-MM-dd'),'yyyy-MM-dd'))
        )

ps:据我所知,没有 date_trunc 中的函数 Hive documentation .

pgpifvop

pgpifvop2#

您正在反向格式化,因此不正确。使用以下代码

select a.event_date,
    date_format(date_trunc('month', a.event_date), '%Y/%m/%d') as date
from monthly_test_table a
order by 1;
9vw9lbht

9vw9lbht3#

根据以下源代码: UTC_CHRONOLOGY 时间被翻译成语言环境,也被翻译成英语 Description 其中提到的会话时区将是精确的,也请参阅下面的url。

@Description("truncate to the specified precision in the session timezone")
@ScalarFunction("date_trunc")
@LiteralParameters("x")
@SqlType(StandardTypes.DATE)
public static long truncateDate(ConnectorSession session, @SqlType("varchar(x)") Slice unit, @SqlType(StandardTypes.DATE) long date)
{
    long millis = getDateField(UTC_CHRONOLOGY, unit).roundFloor(DAYS.toMillis(date));
    return MILLISECONDS.toDays(millis);
}

看到了吗https://prestodb.io/docs/current/release/release-0.66.html:::
时区:
此版本完全支持时区规则,这些规则是正确执行日期/时间计算所必需的。通常,会话时区用于时间计算。这是提交查询的客户端计算机的时区(如果可用)。否则,它就是运行presto协调器的服务器的时区。
使用夏时制之后的时区进行操作的查询可能会产生意外的结果。例如,如果我们运行以下查询以添加在美国/洛杉矶时区使用的24小时:
选择日期添加('小时',24,时间戳'2014-03-08 09:00:00');
输出:2014-03-09 10:00:00.000

相关问题