SQLAlchemy:两个日期之间的差异

2024-05-16 00:29:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道两次约会在SQLAlchemy上的区别。使用Postgresql,我有以下工作:

SELECT
    EXTRACT(EPOCH FROM ('2019-02-11 17:59:05.953894'::timestamp - '2019-02-11 17:59:01.953894'::timestamp))

但是,我在SQLAlchemy中尝试同样的方法时遇到了问题:

session.query(func.extract('epoch',func.date(subquery.c.dt_final.cast(Date)))-
                                   func.date(subquery.c.dt_start.cast(Date))).all()

获取此错误:

ProgrammingError: (psycopg2.errors.UndefinedFunction) operator does not exist: double precision - date
LINE 1: ...h FROM date(CAST(anon_2.dt_final AS DATE))) - date(CAS...
                                                             ^
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.

在SQLAlchemy中,如何正确地获得两个日期之间的差异

谢谢


Tags: fromdatesqlalchemypostgresqldtselectoperatortimestamp
3条回答

可以使用以下代码复制SQL语句:

q1 = sa.select(func.extract('epoch',
                            subquery.c.dt_final.cast(TIMESTAMP) -
                            subquery.c.dt_start.cast(TIMESTAMP)))

其中dt_startdt_finalString列,包含问题中的时间戳字符串。结果列是一个float(4.0,)

然而,在Postgresql中,我们可以直接减去时间戳

test# SELECT 
    '2019-02-11 17:59:05.953894'::timestamp - '2019-02-11 17:59:01.953894'::timestamp AS result;
  result  
══════════
 @ 4 secs
(1 row)

所以我们可以在SQLAlchemy中做同样的事情:

q2 = sa.select(subquery.c.dt_final.cast(TIMESTAMP) - subquery.c.dt_start.cast(TIMESTAMP))

它返回一个datetime.timedelta:(datetime.timedelta(seconds=4),)

如果目标是减去日期而不是时间戳,则将时间戳字符串强制转换为Date并减去

q3 = sa.select(subquery.c.dt_final.cast(Date) - subquery.c.dt_start.cast(Date))

它将返回一个整数列,例如(10,)

您可以使用datediff进行日期差异:

SELECT  DATEDIFF(Here_you_put_units, '2019-02-11 17:59:05.953894', '2019-02-11 17:59:01.953894');

您可以使用的单位:

year    yy, yyyy
quarter qq, q
month   mm, m
dayofyear   dy, y
day dd, d
week    wk, ww
hour    hh
minute  mi, n
second  ss, s
millisecond ms
microsecond mcs
nanosecond  ns

另存为变量:

 SELECT  DATEDIFF(Here_you_put_units, '2019-02-11 17:59:05.953894', '2019-02-11 17:59:01.953894') AS needed_date;

SQL_炼金术:

from sqlalchemy import func, text
from datetime import datetime
date1 = datetime.fromisoformat('2019-02-11 17:59:05.953894')
date2 = datetime.fromisoformat('2019-02-11 17:59:01.953894')
func.datediff(text('Here_you_put_units'), date1, date2)

您可能需要从时间戳切换到日期时间,但有一个名为timediff()的内置函数,其工作原理类似于count()和max()。我不熟悉SQLalchemy,但它应该是非常通用的

相关问题 更多 >