如何通过Python获取并比较PostgreSQL中的两个时间戳值?

0 投票
2 回答
3785 浏览
提问于 2025-04-18 13:37

我现在正在用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 分钟)。

SQL Fiddle

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分钟)。虽然在这个过程中会丢失微秒的信息,但这种精度可能并不是必须的。

撰写回答