如何通过Python获取并比较PostgreSQL中的两个时间戳值?
我现在正在用psycopg2和python来和一个postgreSQL数据库互动。我在一个叫“test”的数据库里,有两个表:“test1”和“test2”。
每个表里都有一行数据,这一行有两个列:
- 日期(Date),里面存的是当前日期的值
- 时间戳(Timestamp),里面存的是当前时间戳的值。
我用下面的代码来查找这些数据:
"""SELECT timestamp
FROM test1
WHERE date = '2014-07-16';"""
当我输入这个时,终端会显示:
timestamp
----------------------------
2014-07-16 16:10:22.380059
(1 row)
现在,我想查看一个时间戳,并让我的程序告诉我这个时间戳是否比另一个时间戳大30分钟。但是,我在获取这些值以便在python中使用时遇到了困难,也不太明白比较的基本操作。我对postgreSQL完全是新手,所以对它的语法不太熟悉,因此在尝试把SELECT命令的结果赋值给一个变量时遇到了很多麻烦,这样我才能用python进行比较。
任何帮助都非常感谢!
谢谢。
2 个回答
0
因为在这个情况下,你已经知道了想要比较的两个值,并且它们都在同一个 Postgres 数据库里,所以我建议你直接用纯 SQL 来进行比较。
也就是说,
假设有这些表:
create table foo
(
id serial,
created timestamp without time zone
);
create table bar
(
id serial,
created timestamp without time zone
);
还有这些数据:
insert into foo (created) VALUES
('2014-07-16 16:10:22.380059'),
('2014-07-16 17:10:21.480048'),
('2014-07-16 16:32:23.580037');
insert into bar (created) VALUES
('2014-07-16 16:44:22.380059'),
('2014-07-16 17:15:21.480048'),
('2014-07-16 16:38:23.580037');
你可以用这样的查询:
select ( (select created from bar order by id limit 1) -
(select created from foo order by id limit 1)
) > interval '30 minutes' as time_diff;
具体每一列的数据怎么获取,可以根据你的需求来调整。
然后在你的 Python 代码里,你会得到一个 0(如果时间不超过 30 分钟)或者 1(如果时间超过 30 分钟)。
2
我之前只用过Python和MySQL,但看起来PostgreSQL也差不多。
>>> cur.execute("SELECT timestamp FROM test1 WHERE date = '2014-07-16'")
>>> cur.fetchone()
根据文档,从数据库中获取的时间戳可能会自动转换成Python中的日期时间对象,这样挺方便的。不过即使它以字符串的形式给出,也没关系:
>>> from datetime import datetime
>>> import time
>>> d = datetime.strptime('2014-07-16 16:10:22.380059', '%Y-%m-%d %H:%M:%S.%f')
>>> time.mktime(d.timetuple())
1405483822.0
把两个日期时间都转换成时间戳,然后相减,检查它们的差值是否大于1800秒(也就是30分钟)。虽然在这个过程中会丢失微秒的信息,但这种精度可能并不是必须的。