如何将时间戳从一个范围扩展到另一个范围?

时间:2015-11-11 11:15:28

标签: sql postgresql datetime timestamp

我已经获得了包含项目更改时间戳的表格:

  • ID:INT
  • item:INT - 外键
  • 已创建:TIMESTAMP

我需要某个项目来将创建的时间戳压缩到某个范围。即:

  • src范围:1.10.2015 00:00 - 4.10.2015 23:59
  • dst范围:1.10.2015 00:00 - 1.10.2015 23:59
  • 所以样本TIMESTAMP看起来像:
    • 2.10.2015 00:00 - > 1.10.2015 6:00
    • 3.10.2015 00:00 - > 1.10.2015 12:00
    • 4.10.2015 00:00 - > 1.10.2015 18:00
    • 4.10.2015 12:00 - > 1.10.2015 21:00

我需要将年,月,日,小时,分钟,秒保留为结果时间戳的一部分。不能将秒/分钟舍入为零。

缩放精度并不重要,但创建的时间戳的更改顺序必须与缩放之前保持一致。我不太关心其他扩展细节:它的开始/最终时间,包含/排除,还是扩展到6:00/5:59小时。

我可以使用一些可以自行转换它的外部应用程序,然后更新时间戳。但是,我现在只需要使用SQL。可能吗?它可能是postgres特定的。

您可以假设,缩放适用后不会发生碰撞。

2 个答案:

答案 0 :(得分:0)

这样的事情?

select id, item, (' ['||created||', '||created_l- '00:00.000001'::time||') ' )::tsrange as some_range from (
select id, item, created  , lead(created) over(order by created)  created_l from my_table  order by created) q1

答案 1 :(得分:0)

with r (src, dst) as ( values
    (
        tsrange('2015-10-01', '2015-10-05', '[)'),
        tsrange('2015-10-01', '2015-10-02', '[)')
    ),
    (
        tsrange('2015-10-06', '2015-10-10', '[)'),
        tsrange('2015-10-02', '2015-10-03', '[)')
    )
), t (id, src) as ( values
    (1,'2015-10-02 00:00'::timestamp),
    (2,'2015-10-03 00:00'),
    (3,'2015-10-04 00:00'),
    (4,'2015-10-04 12:00'),
    (5,'2015-10-06 11:00'),
    (6,'2015-10-07 15:00')
)
select
    t.id, t.src,
    lower(r.dst) + rank() over(
            partition by r.dst order by t.src
    ) * interval '1 second' as squeezed
from
    t
    inner join
    r on t.src <@ r.src
;
 id |         src         |      squeezed       
----+---------------------+---------------------
  1 | 2015-10-02 00:00:00 | 2015-10-01 00:00:01
  2 | 2015-10-03 00:00:00 | 2015-10-01 00:00:02
  3 | 2015-10-04 00:00:00 | 2015-10-01 00:00:03
  4 | 2015-10-04 12:00:00 | 2015-10-01 00:00:04
  5 | 2015-10-06 11:00:00 | 2015-10-02 00:00:01
  6 | 2015-10-07 15:00:00 | 2015-10-02 00:00:02