我在查询下面运行:
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”。
提前致谢...!
答案 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