【问题标题】:Add days to timestamp and get a timestamp back将日期添加到时间戳并获取时间戳
【发布时间】:2021-12-03 15:54:48
【问题描述】:

在 Spark SQL 中,我找不到将天数添加到时间戳并接收回时间戳的函数,我可以使用计算值来执行此操作。

这可行,但 静态

SELECT col1 + interval 2 days FROM 

VALUES make_timestamp(2021, 12, 28, 6, 30, 45.887)

我需要一个我可以计算的。这不起作用(我也不能用列值填充它):

SELECT col1 + interval (5-3) days 

FROM VALUES make_timestamp(2021, 12, 28, 6, 30, 45.887)

这也不好(因为它提供了一个日期):

SELECT date_add(col1,1) FROM 

VALUES make_timestamp(2021, 12, 28, 6, 30, 45.887)

【问题讨论】:

  • 你可以试试你的最后一个解决方案,但只是用to_timestamp(date_add(col1,1))包装它
  • 不幸的是,该解决方案将小时、分钟、秒截断为零
  • 字符串插值,val ndays=5-3; val sql=s"SELECT col1 + interval $ndays days FROM .."

标签: sql apache-spark apache-spark-sql


【解决方案1】:

一种方法是将时间戳转换为 unix 时间并添加所需的秒数。

scala> spark.sql("select from_unixtime(unix_timestamp('2021-10-15 10:11:12') + 10 * 24*60*60) plus10days").show(false)
+-------------------+
|plus10days         |
+-------------------+
|2021-10-25 10:11:12|
+-------------------+

【讨论】:

  • 很好的解决方案@mazaneicha,但我正在寻找上面的解决方案!
  • 谢谢,明白了!他们都有自己的 +es 和 -es :)
【解决方案2】:

您可以使用concat SQL function 构建一个表示您的区间的字符串,然后使用cast SQL function 将其转换为一个区间,而不是直接使用区间构造函数:

SELECT col1 + cast(concat(5-3, ' days') as interval)

FROM VALUES make_timestamp(2021, 12, 28, 6, 30, 45.887)

返回以下结果:

+----------------------------------------------------------------------------------+
|CAST(col1 + CAST(concat(CAST((5 - 3) AS STRING),  days) AS INTERVAL) AS TIMESTAMP)|
+----------------------------------------------------------------------------------+
|2021-12-30 06:30:45.887                                                           |
+----------------------------------------------------------------------------------+

【讨论】:

  • 优雅的解决方案!谢谢!
猜你喜欢
  • 2023-03-31
  • 2011-09-02
  • 1970-01-01
  • 2016-02-26
  • 2014-05-22
  • 1970-01-01
相关资源
最近更新 更多