PostgreSQL的时间戳差异
是否有PostgreSQL的TIMESTAMPDIFF()
等价物?
我知道我可以减去两个时间戳来获得postgresql INTERVAL
。 我只是想要用INT表示的两个时间戳之间的区别。
我可以在MySQL中这样做:
TIMESTAMPDIFF(HOUR, links.created, NOW())
我只需要以小时为单位的两个时间戳之间的差值表示为整数。
解决scheme适用于我:
SELECT "links_link"."created", "links_link"."title", (EXTRACT(EPOCH FROM current_timestamp - "links_link"."created")/3600)::Integer AS "age" FROM "links_link"
第一件事情出现了
EXTRACT(EPOCH FROM current_timestamp-somedate)/3600
可能不会很漂亮,但会疏通道路。 如果定义了区间的划分,那么可能会更漂亮。
编辑 :如果你想要它大于零或使用绝对或最大(…,0)。 无论你的意图如何。
编辑++ :我没有使用age
的原因是,有一个参数的age
,引用文档: 从current_date减去(在午夜) 。 这意味着除非在午夜运行,否则你不会得到准确的“年龄”。 现在已经快到凌晨1点了:
select age(current_timestamp); age ------------------ -00:52:40.826309 (1 row)
在postgresql中获取时间戳大于date的字段:
SELECT * from yourtable WHERE your_timestamp_field > to_date('05 Dec 2000', 'DD Mon YYYY');
在postgresql中从时间戳中减去分钟数:
SELECT * from yourtable WHERE your_timestamp_field > current_timestamp - interval '5 minutes'
从postgresql中的时间戳中减去小时数:
SELECT * from yourtable WHERE your_timestamp_field > current_timestamp - interval '5 hours'
您可以使用“提取”或“date_part”函数间隔以及时间戳,但我不认为这是你想要的。 例如,“2天,3小时”的间隔为3。 然而,你可以通过指定'epoch'作为你想要的时间元素来将时间间隔转换为秒数: extract(epoch from '2 days, 3 hours'::interval)
返回183600(然后你除以3600来转换几秒到几个小时)。
所以,把这一切放在一起,你基本上得到了迈克尔的答案: extract(epoch from timestamp1 - timestamp2)/3600
。 由于您似乎不关心哪个时间戳在哪个前面,所以您可能希望将其包装在abs
:
SELECT abs(extract(epoch from timestamp1 - timestamp2)/3600)
Michael Krelin的回答并不完全安全,因为在罕见的情况下可能是错误的。 问题是PostgreSQL中的时间间隔没有像夏时制这样的事情。 间隔将内部事物存储为月,日,秒。 在这种情况下,几个月不是问题,因为减去两个时间戳只是使用日和秒,但“天”可能是一个问题。
如果您的减法涉及夏令时切换,则特定的一天可能分别被视为23或25小时。 间隔会考虑到这一点,这对于了解符号意义上传递的天数是有用的,但它会给出实际传递小时数的错误数量。 在这个时间间隔的时间将会使所有天数乘以24小时。
例如,如果一个完整的“短”日过去,并在第二天再增加一个小时,则间隔将logging为一天一小时。 转换为epoch / 3600的时间是25小时。 但实际上23小时+ 1小时应该是24小时。
所以更安全的方法是:
(EXTRACT(EPOCH FROM current_timestamp) - EXTRACT(EPOCH FROM somedate))/3600
正如Michael在后续评论中提到的那样,您也可能想使用floor()或round()来获得整数值的结果。
postgresql得到时间戳之间的秒差异
SELECT ( (extract (epoch from ( '2012-01-01 18:25:00'::timestamp - '2012-01-01 18:25:02'::timestamp ) ) ) )::integer
打印:
-2
因为时间戳是两秒钟的时间。 取数字除以60得分,再除以60得小时。
对于喜欢利用数据库function的很多开发人员来说,这可能听起来很疯狂,
但经过详尽的问题思考,创build和修复应用程序的MySQL和Postgrsql与PHP比较date函数,我得出结论(对我自己),最简单的方法,这是最简单的,lessSQL烦恼是不占优势其中任何一个。
为什么? 因为如果您正在使用像PHP这样的中间件语言进行开发,那么PHP具有所有这些function,并且在应用程序代码中比较整数更容易实现。 PostgreSQL的时间戳不是== UNIX TIMESTAMP和MySQL的UNIX TIMESTAMP不是PostgresQL的或者ORACLE的时间戳..如果你使用数据库时间戳,它会变得更难以移植。
所以使用一个整数,而不是一个时间戳,作为自1970年1月1日午夜以来的秒数。 并不介意数据库时间戳。 ,并使用gmdate()并将所有内容存储为gmt时间以避免时区问题。
如果您需要在应用程序中search,sorting或比较其他数据的date,或者一个月或一年中的某一天,或者比较time_day,time_hour,time_seconds .. INTEGER数据types或任何您想要的要search索引将会使更stream畅和更便携的数据库。 你可以使用一个字段,在大多数情况下:INTEGER time_created NOT NULL
(数据库行中的更多字段是我find的这个解决scheme的唯一缺点,而且这不会导致许多令人头痛的事情,或者一杯咖啡:)
PHP的date函数是优秀的比较date,但在MySQL或Postgresql,比较date? 恩..使用整数SQL比较
我意识到它可能SEEM更容易使用插入函数CURRENT_TIMESTAMP。 哈! 不要被愚弄。
如果time-intitialized是postgresql时间戳,你不能做DELETE FROM SESSION_TABLE WHERE time-initialized < '2 days'
。 但你可以这样做:
DELETE FROM SESSION_TABLE WHERE time_initialized < '$yesterday'
只要你在PHP中设置$昨天是自1970年以来的整数秒。
这比sessiongresql select语句中的时间戳更容易pipe理会话logging。
SELECT age(),SELECT extract()和asbtime是一个令人头痛的问题。 这只是我的看法。
您可以使用phpdate对象来添加,减去<,>
_peter_sysko U4EA Networks,Inc.
extract(hour from age(now(),links.created))
给你一个小时差的楼层数。