Postgres,将TIMESTAMP更新为当前日期,但保留时间

时间:2017-08-13 19:35:07

标签: sql postgresql

在我的Postgres数据库中,我有下表:

SELECT start_at, end_at FROM schedules;

+---------------------+---------------------+
| start_at            | end_at              |
|---------------------+---------------------|
| 2016-09-05 16:30:00 | 2016-09-05 17:30:00 |
| 2016-09-05 17:30:00 | 2016-09-05 18:30:00 |
| 2017-08-13 03:00:00 | 2017-08-13 07:00:00 |
| 2017-08-13 03:00:00 | 2017-08-13 07:00:00 |
| 2017-08-13 18:42:26 | 2017-08-13 21:30:46 |
| 2017-08-10 00:00:00 | 2017-08-10 03:30:00 |
| 2017-08-09 18:00:00 | 2017-08-10 03:00:00 |
| 2017-08-06 23:00:00 | 2017-08-07 03:00:00 |
| 2017-08-07 01:00:00 | 2017-08-07 03:48:20 |
| 2017-08-07 01:00:00 | 2017-08-07 03:48:20 |
| 2017-08-07 18:05:00 | 2017-08-07 20:53:20 |
| 2017-08-07 14:00:00 | 2017-08-08 01:00:00 |
| 2017-08-07 18:00:00 | 2017-08-07 20:48:20 |
| 2017-08-08 08:00:00 | 2017-08-09 00:00:00 |
| 2017-08-09 21:30:00 | 2017-08-10 00:18:20 |
| 2017-08-13 03:53:26 | 2017-08-13 06:41:46 |
+---------------------+---------------------+

假设我还有一个ID列,我想要做的是更新今天(现在)的所有开始和结束时间,实现这一目标的最有效的SQL是什么?我的桌子可能有数百万行。

1 个答案:

答案 0 :(得分:2)

我能想到的最好的是:

 update schedules 
    set start_at = current_date + start_at::time
      , end_at = current_date + end_at::time 
    WHERE start_at::date <> current_date
       or end_at::date <> current_date;

与访问行相比,算法更快。 如果不是所有行都需要更新,where子句将有助于提高效率。更新很昂贵。