我目前正在使用psycopg2和python与postgreSQL数据库进行交互。我在一个名为“test”的数据库中,有两个表:“test1”和“test2”。
每个表中有一行,该行有两列:
我使用以下代码搜索它:
"""SELECT timestamp
FROM test1
WHERE date = '2014-07-16';"""
如果我输入此信息,终端会给出:
timestamp
----------------------------
2014-07-16 16:10:22.380059
(1 row)
现在,我想查看一个时间戳,并让我的程序告诉我它是否超过另一个时间超过30分钟。但是,我在获取这些值以便在python中使用时遇到了麻烦,并且弄清楚比较是如何工作的。我对postgreSQL完全不熟悉,所以我对它的语法不太熟悉,所以我在尝试将SELECT命令的结果分配给变量时遇到了很多麻烦,然后我可以使用python进行比较。
感谢任何和所有帮助!
感谢。
答案 0 :(得分:1)
我只使用Python和MySQL,但是postgreSQL doesn't seem too different:
>>> cur.execute("SELECT timestamp FROM test1 WHERE date = '2014-07-16'")
>>> cur.fetchone()
现在,从文档中看,从DB中检索的时间戳可能会自动转换为Python中的datetime对象,这很方便。但即使它是一个字符串,这仍然不是问题:
>>> 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 * 60)秒。在此过程中丢失微秒,但可能不需要此级别的粒度。
答案 1 :(得分: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分钟。