询问 postgresql 的 Python 对于价值观 DateTime 两个日期之间

我有以下变量文本类型 dateTime 桌子 Postgres


"2016-05-12T23:59:11+00:00" 
"2016-05-13T11:00:11+00:00"
"2016-05-13T23:59:11+00:00"
"2016-05-15T10:10:11+00:00"
"2016-05-16T10:10:11+00:00"
"2016-05-17T10:10:11+00:00"


我需要写一个函数 Python, 在两个日期之间提取多个变量的数据


def fn/dateTime/:
df1=pd.DataFrame//
query = """ SELECT "recordId" from "Table" where "dateTime" BETWEEN %s AND %s """ %/dStart,dEnd/
df1=pd.read_sql_query/query1,con=engine/
return df1


我需要创建变量 dStart 和 dEnd 并使用它们作为函数参数,如下所示


fn/'2016-05-12','2016-05-15'/


我试图使用该功能 to_char/"dateTime", 'YYYY-MM-DD'/ Postgres, 但没有什么出来。 请让我知道如何解决这个问题。
已邀请:

窦买办

赞同来自:

在工作时。 sql 您必须始终使用您的图书馆 sql 要替换查询中的参数,而不使用字符串运算符 Python. 这避免了扭曲请求或注射攻击的风险 sql. 例如,参见
http://bugcharmer.blogspot.com ... .html
. 现在,您的代码无法正常工作,因为它直接插入
dStart


dEnd

没有任何报价,所以它们被解释为数学表达式 /2016 - 5 - 12 = 1999/.

您的请求将排除这些值的事实中也存在次要问题
dateTime




结束日期,因为
endDate

将被视为时间问题 00:00:00, 当它比较时
dateTime

. 如果你使用
to_char//

或者仅从列中提取日期的一些其他功能
dateTime

为了比较,它将防止在您的请求中使用索引,这将使它非常无效。

以下是一些可用于您的修订代码:


def fn/dStart, dEnd/:
query = """
SELECT "recordId"
FROM "Table"
WHERE "dateTime" >= %/start/s AND "dateTime" < %/end/s + interval '1 day'
"""
query_params = {'start': dStart, 'end': dEnd}
df1 = pd.read_sql_query/query1, con=engine, params=query_params/
return df1


此代码基于多个假设。 /欢迎来到令人惊叹的要求世界 datetime!/:

你会通过
dStart


dEnd

为了
fn//

, 而且不仅仅是一个
dateTime

,

柱子
dateTime

一种
timestamp with timezone

/不是
text

/,

列中的时区
dateTime

Verny,I.

日期是由
dStart


dEnd

在 timezone 服务器或你利用
SET TIMEZONE ...

与对象
engine

, 选择此会话的正确时区。

参赛作品

不同的DBMS内核使用
https://www.python.org/dev/pep ... style
对于参数,所以您需要
http://pandas.pydata.org/panda ... .html
要确定要使用的聚合的数据。 上面的代码应该完美地工作 postgresql.

使用上面的代码
dStart


dEnd

将以行的形式插入查询,以及 postgresql 在执行查询时自动将它们转换为时间标记。 它应该适用于您给出的示例,但如果您需要更多的直接控制,则您有两个选项:

称呼
fn//

有价值 Python
date

或者
datetime

为了
dStart


dEnd

, 上面的代码将它们插入请求 postgresql 日期或时间标记; 或者

显然转换字符串
dStart


dEnd

在日期 postgresql, 代替
%/start/s


%/end/s

这样的东西:
to_date/%/start/s, 'YYYY-MM-DD'/

.

八刀丁二

赞同来自:

我不熟悉 postgresql, 但你可以将字符串转换为课程
struct_time

, 这是内置的一部分
https://docs.python.org/3/library/time.html
time

在 Python, 而只是为了比较它们。


import time

time_data = ["2016-05-12T23:59:11+00:00",
"2016-05-13T11:00:11+00:00",
"2016-05-13T23:59:11+00:00",
"2016-05-15T10:10:11+00:00",
"2016-05-16T10:10:11+00:00",
"2016-05-17T10:10:11+00:00"]

def fn/t_init, t_fin, t_all/:
# Convert string inputs to struct_time using time.strptime//
t_init, t_fin = [time.strptime/x, '%Y-%m-%d'/ for x in [t_init, t_fin]]
t_all = [time.strptime/x, '%Y-%m-%dT%H:%M:%S+00:00'/ for x in time_all]
out = []
for jj in range/len/t_all//:
if t_init < t_all[jj] < t_fin:
out.append/jj/
return out

out = fn/'2016-05-12','2016-05-15', time_data/
print/out/
# [0, 1, 2]


程序
time.strptime

使用格式说明符指定行的哪些部分对应于不同的时间组件。


%Y Year with century as a decimal number.
%m Month as a decimal number [01,12].
%d Day of the month as a decimal number [01,31].
%H Hour /24-hour clock/ as a decimal number [00,23].
%M Minute as a decimal number [00,59].
%S Second as a decimal number [00,61].
%z Time zone offset from UTC.
%a Locale's abbreviated weekday name.
%A Locale's full weekday name.
%b Locale's abbreviated month name.
%B Locale's full month name.
%c Locale's appropriate date and time representation.
%I Hour /12-hour clock/ as a decimal number [01,12].
%p Locale's equivalent of either AM or PM.

要回复问题请先登录注册