使用 SQLAlchemy 在 POSTGRES 中计算 DATEDIFF
Calculate DATEDIFF in POSTGRES using SQLAlchemy
我需要在 timestamp 类型的 2 列之间以分钟为单位计算 DATEDIFF。
网络上有很多简单的示例,但是 none 使用 psycopg2 + sqlalchemy 时,其中的 none 确实可以正常工作。
我试过:
from sqlalchemy import as sa
from datetime import datetime
# con is a standard pool of connections :class:Connection
con.execute(
sa.func.datediff(
sa.literal_column('minute'),
datetime.utcnow(),
datetime.utcnow(),
)
)
它抛出:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) column "minute" does not exist
LINE 1: SELECT datediff(minute, '2017-02-27T15:04:33.217559'::timest...
^
[SQL: 'SELECT datediff(minute, %(datediff_2)s, %(datediff_3)s) AS datediff_1'] [parameters: {'datediff_3': datetime.datetime(2017, 2, 27, 15, 4, 33, 217596), 'datediff_2': datetime.datetime(2017, 2, 27, 15, 4, 33, 217559)}]
如果我尝试:
con.execute(
sa.func.datediff(
'minute',
datetime.utcnow(),
datetime.utcnow(),
)
)
我收到:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) function datediff(unknown, timestamp without time zone, timestamp without time zone) does not exist
LINE 1: SELECT datediff('minute', '2017-02-27T12:27:49.369724'::time...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
[SQL: 'SELECT datediff(%(datediff_2)s, %(datediff_3)s, %(datediff_4)s) AS datediff_1'] [parameters: {'datediff_4': datetime.datetime(2017, 2, 27, 12, 27, 49, 369740), 'datediff_2': 'minute', 'datediff_3': datetime.datetime(2017, 2, 27, 12, 27, 49, 369724)}]
有什么正确的想法吗?
PostgreSQL does not have a datediff
function. To get the number of minutes, use the SQL expression:
trunc((extract(epoch FROM newer_date) - extract(epoch FROM older_date)) / 60)
extract(epoch FROM …)
将时间戳转换为秒数。
/ 60
将秒转换为分钟
trunc(…)
删除小数部分。
所以可能会尝试
sa.func.trunc((
sa.extract('epoch', datetime.utcnow()) -
sa.extract('epoch', datetime.utcnow())
) / 60)
我需要在 timestamp 类型的 2 列之间以分钟为单位计算 DATEDIFF。 网络上有很多简单的示例,但是 none 使用 psycopg2 + sqlalchemy 时,其中的 none 确实可以正常工作。 我试过:
from sqlalchemy import as sa
from datetime import datetime
# con is a standard pool of connections :class:Connection
con.execute(
sa.func.datediff(
sa.literal_column('minute'),
datetime.utcnow(),
datetime.utcnow(),
)
)
它抛出:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) column "minute" does not exist
LINE 1: SELECT datediff(minute, '2017-02-27T15:04:33.217559'::timest...
^
[SQL: 'SELECT datediff(minute, %(datediff_2)s, %(datediff_3)s) AS datediff_1'] [parameters: {'datediff_3': datetime.datetime(2017, 2, 27, 15, 4, 33, 217596), 'datediff_2': datetime.datetime(2017, 2, 27, 15, 4, 33, 217559)}]
如果我尝试:
con.execute(
sa.func.datediff(
'minute',
datetime.utcnow(),
datetime.utcnow(),
)
)
我收到:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) function datediff(unknown, timestamp without time zone, timestamp without time zone) does not exist
LINE 1: SELECT datediff('minute', '2017-02-27T12:27:49.369724'::time...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
[SQL: 'SELECT datediff(%(datediff_2)s, %(datediff_3)s, %(datediff_4)s) AS datediff_1'] [parameters: {'datediff_4': datetime.datetime(2017, 2, 27, 12, 27, 49, 369740), 'datediff_2': 'minute', 'datediff_3': datetime.datetime(2017, 2, 27, 12, 27, 49, 369724)}]
有什么正确的想法吗?
PostgreSQL does not have a datediff
function. To get the number of minutes, use the SQL expression:
trunc((extract(epoch FROM newer_date) - extract(epoch FROM older_date)) / 60)
extract(epoch FROM …)
将时间戳转换为秒数。/ 60
将秒转换为分钟trunc(…)
删除小数部分。
所以可能会尝试
sa.func.trunc((
sa.extract('epoch', datetime.utcnow()) -
sa.extract('epoch', datetime.utcnow())
) / 60)