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 中的 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'

【讨论】:

以上是关于Postgresql 中从 Now() 到 Current_timestamp的主要内容,如果未能解决你的问题,请参考以下文章

在新的 Rails 项目中从 SQLite 更改为 PostgreSQL

在RedHat中从postgresql 9.2升级到9.6时unix_socket_directory出错

postgresql - 为啥 now() 保存后不正确?

在 Perl DBI 中从 PostgreSQL 捕获 NOTICE

PostgreSQL now()函数没有返回时间

如何在 POSTGRESQL 中从 DATE 中提取年份