PostgreSQL按天分组时间戳

时间:2019-12-13 02:22:17

标签: postgresql sql-timestamp

我有一个表x(x_id,ts),其中ts是一个时间戳。 我还有第二个表y(y_id,day,month,year),应该具有x(ts)的值。 (x_id和y_id都是串行的) 例如:

            x                                  y

_x_id_|__________ts__________        _y_id_|_day_|_month_|__year__
  1   | '2019-10-17 09:10:08'          1     17     10      2019
  2   | '2019-01-26 11:12:02'          2     26      1      2019

但是,如果在x上我在同一天但有不同的小时数有2个时间戳,则这两个表应如下所示:

            x                                  y

_x_id_|__________ts__________        _y_id_|_day_|_month_|__year__
  1   | '2019-10-17 09:10:08'          1     17     10      2019
  2   | '2019-10-17 11:12:02'        

含义y不能有两行相同的日期,月份和年份。 目前,我的操作方式是:

INSERT INTO y(day, month, year)
SELECT
EXTRACT(day FROM ts) AS day,
EXTRACT(month FROM ts) AS month,
EXTRACT(year FROM ts) AS year
FROM x
ORDER BY year, month, day;

但是,您可能知道,这不会检查时间戳记是否共享同一日期,那么我该怎么做? 谢谢您的时间!

2 个答案:

答案 0 :(得分:2)

假设您按照上述建议构建唯一索引,请将插入内容更改为:

insert into y(day, month, year)
  select extract(day from ts) as day,
       , extract(month from ts) as month,
       , extract(year from ts) as year
    from x
    on conflict do nothing;

我希望您的表X不会太大,因为上述插入(如您的原始表)将尝试在每次执行时为X中的每一行向Y中插入一行- NO WHERE 子句。

答案 1 :(得分:1)

将表y上的UNIQUE约束添加到 prevent 中,两次添加相同的日期。

CREATE UNIQUE INDEX CONCURRENTLY y_date 
ON y (year,month,day)

然后将其添加到y

ALTER TABLE y
ADD CONSTRAINT y_unique_date
UNIQUE USING INDEX y_date

请注意,如果违反约束,则会收到SQL错误。如果您不希望这样做,而忽略INSERT,请使用BEFORE INSERT trigger,当检测到“日期”已存在时返回NULL,或者在{{1 }}语句,如hinted by @Belayer