Postgresql 中从 Now() 到 Current_timestamp
Posted
技术标签:
【中文标题】Postgresql 中从 Now() 到 Current_timestamp【英文标题】:From Now() to Current_timestamp in Postgresql 【发布时间】: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
我该如何解决?
【问题讨论】:
【参考方案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 functions 和 operators
所以 MySQL 时间本质上让您将 NOW()
视为一种更笨的类型,或者它会覆盖 +
以做出我在 MySQL 文档中找不到的假设。不管怎样,你可能想看看 pg 中的 date
和 interval
类型。
【讨论】:
【参考方案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()
。问题是您不能从timestamp
或timestamptz
中添加/减去整数。您可以按照 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'
【讨论】:
以上是关于Postgresql 中从 Now() 到 Current_timestamp的主要内容,如果未能解决你的问题,请参考以下文章
在新的 Rails 项目中从 SQLite 更改为 PostgreSQL
在RedHat中从postgresql 9.2升级到9.6时unix_socket_directory出错