hive中的date_trunc工作不正常

时间:2017-12-14 11:27:07

标签: hive presto

我在查询下面运行:

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_trunc后显示我的日期为“09/30/2017”。

提前致谢...!

3 个答案:

答案 0 :(得分:0)

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

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;

答案 1 :(得分:0)

您可以使用带有逻辑的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:据我所知,Hive documentation中没有date_trunc功能。

答案 2 :(得分:0)

根据以下源代码:UTC_CHRONOLOGY时间被翻译为w.r.t. locale,同样在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小时:

     

选择date_add('小时',24,TIMESTAMP' 2014-03-08 09:00:00 ');

     

输出: 2014-03-09 10:00:00.000