有没有办法将时间戳向上或向下舍入到最接近的 30 分钟间隔?

Posted

技术标签:

【中文标题】有没有办法将时间戳向上或向下舍入到最接近的 30 分钟间隔?【英文标题】:Is there a way to round a timestamp up or down to the nearest 30 minute interval? 【发布时间】:2021-11-12 19:02:58 【问题描述】:

我目前正在使用 Presto,我想知道如何将时间戳向上或向下舍入到最接近的 30 分钟间隔?

这是我的时间戳的样子: 2021-08-23 17:46:06

这就是我想要的样子: 2021-08-23 18:00

提前非常感谢!

【问题讨论】:

【参考方案1】:

四舍五入 - 取处理后的日期,加上 30 分钟减去精度(1 分钟表示分钟,1 秒表示秒等),然后取一些“基本”日期('2021-01-01' 以防万一我的测试数据),找到以分钟为单位的差异,然后除以 30 并乘以 30,然后将结果添加回基本日期,基本上是四舍五入修改后的日期。四舍五入的工作方式相同,但不增加 30 分钟:

WITH dataset(time) AS (
   VALUES 
  (timestamp '2021-08-23 17:29:59'),
  (timestamp '2021-08-23 17:30:00'),
  (timestamp '2021-08-23 17:30:01'),
  (timestamp '2021-08-23 17:31:01'),
  (timestamp '2021-08-23 17:59:59'),
  (timestamp '2021-08-23 18:00:00'),
  (timestamp '2021-08-23 18:00:01')
 ) 
 
SELECT date_add(
  'minute', 
  date_diff(
    'minute',
    timestamp '2021-01-01', -- "base" date
    (time + interval '30' minute - interval '1' second) -- remove the +/- interval parts to round down
  ) / 30 * 30, 
  timestamp '2021-01-01') -- "base" date
FROM dataset

输出:

_col0
2021-08-23 17:30:00.000
2021-08-23 17:30:00.000
2021-08-23 18:00:00.000
2021-08-23 18:00:00.000
2021-08-23 18:00:00.000
2021-08-23 18:00:00.000
2021-08-23 18:30:00.000

【讨论】:

抱歉,快速提问 - 你的解释仍然超出我的能力范围,但可以安全地假设我不需要更改“基准日期”吗? @MaggieLiu 如果所有数据都在日期之后 - 那么是的。

以上是关于有没有办法将时间戳向上或向下舍入到最接近的 30 分钟间隔?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中舍入到最接近的 3 倍数? [复制]

如何将值向上舍入到一个数字的最接近的因子[重复]

r 将数字向上或向下舍入到一个漂亮的数字

将 DateTime 舍入到最接近的半小时 [重复]

将双精度舍入到最接近的非次正规表示

即使在 C 中使用“\n%.2f”后,也无法将浮点值舍入到最接近的第二个小数 [关闭]