【问题标题】:How can i add days to a Hive timestamp without loosing hours, minutes and seconds如何在不丢失小时、分钟和秒的情况下将天添加到 Hive 时间戳
【发布时间】:2022-01-20 13:05:39
【问题描述】:

我正在使用 Hive 2.6.5,当我想在时间戳中添加天数时,它不会保留小时、分钟和秒。

示例

SELECT from_unixtime(unix_timestamp(date_add("2021-01-15 09:34:21",2),'yyyyMMdd'),'yyyy-MM-dd HH:mm:ss');

除此之外,它还返回一个错误的结果:

2020-12-01 **00:00:00**

我希望它返回值 2021-01-17 09:34:21

谢谢

【问题讨论】:

标签: sql hive timestamp hiveql


【解决方案1】:
  1. date_add 截断
  2. 不必要的 unix_timestamp+from_unixtime 转换

转换为时间戳,添加间隔:

SELECT timestamp("2021-01-15 09:34:21") + interval '2' day;

结果:

2021-01-17 09:34:21.0

时间戳以零毫秒部分显示,它是默认的时间戳表示。 如果您希望它为没有毫秒的字符串,请使用 date_format 格式化或简单地使用 substr()

SELECT date_format(timestamp("2021-01-15 09:34:21") + interval '2' day,'yyyy-MM-dd HH:mm:ss')

结果:

2021-01-17 09:34:21

同样使用 substr:

SELECT substr(timestamp("2021-01-15 09:34:21") + interval '2' day,1,19)

如果您需要动态计算间隔,而您的 Hive 版本不支持,请参见此示例:

with mytable as (
select timestamp("2021-01-15 09:34:21") ts, 2 d
)
SELECT from_unixtime(unix_timestamp(ts) + (d*24*60*60))
from mytable

结果:

2021-01-17 09:34:21

【讨论】:

  • 效果很好。我只是在当天的号码上添加了简单的报价:SELECT date_format(timestamp("2021-01-15 09:34:21") + INTERVAL '2' DAY,'yyyy-MM-dd HH:mm:ss');
  • @Azo 嗯......它在 demo.gethue.com 上没有引号。添加了引号。
  • Interval 的值可以是列的值吗?例如:SELECT myTable.col1, date_format(timestamp("2021-01-15 09:34:21") + INTERVAL myTable.col1 DAY,'yyyy-MM-dd HH:mm:ss') FROM myTable ;跨度>
  • @Azo 如果它在您的 Hive 中不起作用,则转换为 unix_timestamp(返回秒),以秒为单位添加间隔(天* 24*60*60),将结果转换为时间戳(from_unixtime)跨度>
  • 实际上我在描述中犯了一个错误,我使用 Hive 1.2。因此,将间隔添加为秒的第二种方法效果很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多