【问题标题】:From Now() to Current_timestamp in PostgresqlPostgresql 中从 Now() 到 Current_timestamp
【发布时间】:2011-02-28 22:11:35
【问题描述】:

在 mysql 中我可以做到这一点:

SELECT *
FROM table
WHERE auth_user.lastactivity > NOW() - 100

现在在 postgresql 中我正在使用这个查询:

SELECT *
FROM table
WHERE auth_user.lastactivity > CURRENT_TIMESTAMP - 100

但我收到此错误:

operator does not exist: timestamp with time zone - integer

我该如何解决?

【问题讨论】:

    标签: sql datetime postgresql


    【解决方案1】:

    这是 MySQL 文档对 NOW() 的评价:

    将当前日期和时间作为YYYY-MM-DD HH:MM:SS 中的值返回或 YYYYMMDDHHMMSS.uuuuuu 格式, 取决于功能是否 在字符串或数字上下文中使用。 该值以电流表示 时区。

    mysql> SELECT NOW();
            -> '2007-12-15 23:50:26'
    mysql> SELECT NOW() + 0;
            -> 20071215235026.000000
    

    现在,您当然可以将智能约会减少到更少...

    SELECT (
     date_part('year', NOW())::text
     || date_part('month', NOW())::text
     || date_part('day', NOW())::text
     || date_part('hour', NOW())::text
     || date_part('minute', NOW())::text
     || date_part('second', NOW())::text
    )::float8 + foo;
    

    但是,这将是一个非常糟糕的主意,您需要了解的是时间和日期不是愚蠢的无格式数字,它们是他们的 own type 以及他们的 own set of functionsoperators

    所以 MySQL 时间本质上让您将 NOW() 视为一种更笨的类型,或者它会覆盖 + 以做出我在 MySQL 文档中找不到的假设。不管怎样,你可能想看看 pg 中的 dateinterval 类型。

    【讨论】:

      【解决方案2】:
      select * from table where column_date > now()- INTERVAL '6 hours';
      

      【讨论】:

      • 虽然这可能会回答问题,但也请简要说明您的代码做了什么以及为什么它解决了最初的问题。
      【解决方案3】:

      这是一个例子......

      select * from tablename where to_char(added_time, 'YYYY-MM-DD')  = to_char( now(), 'YYYY-MM-DD' )
      

      added_time 是一个列名,我将其转换为 char 以进行匹配

      【讨论】:

      • 这会很慢,因为它计算每一行的操作。所以它不能在普通的added_time 列上使用索引。当然,您可以创建在to_char(added_time, 'YYYY-MM-DD') 上说的功能索引,但在这种情况下似乎开销很大。
      【解决方案4】:

      您也可以在 Postgres 中使用 now()。问题是您不能从timestamptimestamptz 中添加/减去整数。您可以按照 Mark Byers 的建议进行操作并减去一个区间,或者使用允许您加/减整数的 date 类型

      SELECT now()::date + 100 AS date1, current_date - 100 AS date2
      

      【讨论】:

      • 不是贬低,而是:INTERVAL 让您在执行日期数学时清楚地知道您在哪个单位工作。例如,now()::date + 100 代表哪个未来时刻是不明显的。是否存在整数数学比 INTERVAL 数学需要的情况?
      【解决方案5】:

      使用区间而不是整数:

      SELECT *
      FROM table
      WHERE auth_user.lastactivity > CURRENT_TIMESTAMP - INTERVAL '100 days'
      

      【讨论】:

        猜你喜欢
        • 2020-04-05
        • 1970-01-01
        • 2020-03-08
        • 2019-05-02
        • 1970-01-01
        • 2020-09-22
        • 2013-07-09
        • 2021-05-28
        • 2011-04-27
        相关资源
        最近更新 更多