从Now()到Postgresql中的Current_timestamp


76

在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

我该如何解决?

Answers:


132

使用间隔而不是整数:

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

34

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

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

4
不是降低投票权,而是:执行日期数学时,INTERVAL可以使您清楚地知道要使用哪个单元。例如,未来的某个时刻now()::date + 100代表什么并不明显。是否存在比INTERVAL数学更需要整数数学的情况?
克里斯·贝蒂

6

这是一个例子...

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

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


这将非常慢,因为它将计算每行的操作。因此,它不能在普通added_time列上使用索引。当然,您可能会在上面创建功能索引,to_char(added_time, 'YYYY-MM-DD')但是在那种情况下看起来有些开销。
哈比图斯'17

6

这是MySQL文档所说的NOW()

返回当前日期和时间作为值的形式YYYY-MM-DD HH:MM:SSYYYYMMDDHHMMSS.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;

但是,那将是一个非常糟糕的主意,您需要了解的是时间和日期不是愚蠢的无格式数字,它们是属于自己的类型,具有自己的一组函数运算符

因此,MySQL时间本质上允许您将其NOW()视为哑巴类型,或者它被覆盖+以做出我在MySQL文档中找不到的假设。无论哪种方式,您都可能希望查看pg中的dateinterval类型。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.