SQLAlchemy:两个日期之间的差异

4
我希望能够在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中获取两个日期之间的差异?

谢谢


1
请注意,在SQLA版本中,您需要先提取再减去。而在原始SQL中则相反。 - Ilja Everilä
1
另外,由于在您的SQLA版本中进行了日期转换,因此减法的结果将是两个日期之间的天数。您是否想要转换为时间戳? - Ilja Everilä
3个回答

4
您可以使用 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;

SQLAlchemy:

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)

谢谢dreeeeeedd,我发现这是不可能的:https://dev59.com/bJ_ha4cB1Zd3GeqP0Ygd - John Barton
尽力了 :( 再试一次 - dreeeeeedd

0

可以使用以下代码重现SQL语句:

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

其中dt_startdt_final是包含时间戳字符串的String列。结果列是一个浮点数(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,)


0

你可能需要从时间戳切换到日期时间,不过有一个内置函数叫做timediff(),它的工作方式类似于count()和max()之类的函数。我不熟悉SQLalchemy,但它应该是相当通用的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接