【问题标题】:date_trunc in hive is working incorrectlyhive 中的 date_trunc 工作不正常
【发布时间】:2018-05-28 11:25:55
【问题描述】:

我正在运行以下查询:

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

谁能告诉我为什么在使用 date_trunc 后日期“2017-10-01”显示日期为“09/30/2017”。

在此先感谢...!

【问题讨论】:

  • 您能否在问题中包含您想要的格式,这将有助于回答问题。
  • 你能告诉我时区吗?
  • 除了会话时区,monthly_test_table 的定义是什么——它是如何创建的,如何读取的。您使用的是 Hive 还是 Presto?

标签: hive presto


【解决方案1】:

你是反向格式,所以它是不正确的。 使用下面的代码

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;

【讨论】:

    【解决方案2】:

    您可以使用 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 函数。

    【讨论】:

      【解决方案3】:

      根据下面的源代码:UTC_CHRONOLOGY 时间被翻译成 w.r.t。语言环境,也在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 小时:

      SELECT date_add('hour', 24, TIMESTAMP '2014-03-08 09:00:00');

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-22
        • 2021-11-23
        • 1970-01-01
        • 2020-04-23
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 2015-01-16
        相关资源
        最近更新 更多