【问题标题】:Insert data from column to another different table column with modifying in PSQL将数据从列插入到另一个不同的表列,并在 PSQL 中进行修改
【发布时间】:2017-11-18 16:26:15
【问题描述】:

我有一个名为 log 的表,其中包含一个名为 time 的列,它是带有时区的时间戳,我想删除时间,只留下日期,然后将修改结果放在名为 error 的表中名为 day 的另一列中。 例如,如果日志表中的时间列看起来像这样错误表中的日期列应该像这样。

 |---------- time --------|      |-----day-----| 
 | 2016-07-01 09:00:00+02 |      | 2016-07-01  |
 | 2016-07-01 09:00:47+02 |      | 2016-07-01  |
 | 2016-07-01 09:00:34+02 |      | 2016-07-01  | 

【问题讨论】:

  • 您为什么要这样做?您始终可以从时间戳列中提取该信息。关系数据库中的一条规则:不要存储可以从现有数据中轻松派生的数据。提取时间戳的日期部分是一项非常廉价的操作。

标签: sql postgresql date


【解决方案1】:

INSERT INTO 错误(天)(从日志中选择时间::日期)

【讨论】:

    【解决方案2】:

    PostgreSQL 中有 SUBSTRING 函数可以做你想做的事。您可以像这样从 SELECT 中执行 INSERT:

    INSERT INTO error
        ( day
        )
    SELECT SUBSTRING (time::TEXT FROM 1 FOR 10)
    FROM log
    

    更多简洁的功能,请查看Postgres's Documentation - 我不确定你的 PostgreSQL 是什么版本,所以这是 8.1 版

    【讨论】:

      【解决方案3】:

      如果你真的想要这样做,应该是这样的:

      update log
      set day = cast (time as date)
      where
        day is null or day != cast (time as date);
      

      DML 可能很昂贵,因此请确保不要更新值已经匹配的行。

      也就是说,不要那样做。要么在查询时解决这个问题,要么如果你真的很懒,创建一个视图:

      create or replace view log_dated as
      select
        l.*, cast (l.time as date) as day
      from log l;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多