将python日期列表传递给sql查询where claus

2024-09-30 20:25:01 发布

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

我在数据框中有一个日期列,我将其转换为日期列表

begdtlist = df["BEG_DT"].tolist()

print(begdtlist)返回以下内容。在

^{pr2}$

日期的类型被强制转换为时间戳。在

我将这个列表传递给一个SQL查询,如下所示

sql = ("select  calndr_dt,wk_of_mnth from DatabaseName where calndr_dt = cast {} as date").format(repr(begdtlist).replace('[','(').replace(']',')'))

但是,我的sql是以下面的格式生成的,这导致查询失败。在

"select  calndr_dt,wk_of_mnth from DatabaseName where calndr_dt = cast 
(Timestamp('2018-04-29 00:00:00'), Timestamp('2018-04-22 00:00:00'), 
Timestamp('2018-04-22 00:00:00'), Timestamp('2018-04-29 00:00:00'), 
Timestamp('2018-04-29 00:00:00')) as date"

我不知道为什么它是作为时间戳来的。我只需要引用日期部分。如有任何指导,我们将不胜感激。在


Tags: offrom列表sqlas时间dtwhere
1条回答
网友
1楼 · 发布于 2024-09-30 20:25:01

您正在使用repr()将对象转换为字符串。此方法不适用于应用它的用例;它提供了有关基础对象的内部表示的信息。在

您真正想做的是格式化您的时间戳,使之成为适合您需要的字符串。与常规python Datetime对象一样,pandas'Timestamp对象也有一个名为strftime()的方法,用于字符串格式化。在

# This part is just to create a MWE; it mimics your dataframe that we
# do not have at hand here.
df = pandas.DataFrame({
    'BEG_DT': [
        pandas.Timestamp('2018-04-29'),
        pandas.Timestamp('2019-04-22')]
    })

# This is what you did
begdtlist = df['BEG_DT'].tolist()
print(begdtlist)

# This is how you can format the date according to your needs
for dt in begdtlist:
    print(dt.strftime('%Y-%m-%d'))

这将生成以下输出:

^{pr2}$

在第2行和第3行中,格式已经创建了SQL查询生成所需的日期字符串。你可以阅读formatting options in the official python docs。在

顺便说一句,pandas将你的日期转换成它自己的Timestamp对象,因为它们需要用于DataFrame交互和聚合等的接口,而这些接口在常规pythonDateDatetime对象中不存在。在

但是,您不能在SQL查询中使用该列表,因为它将生成无效语法:

SELECT calndr_dt, wk_of_mnth
FROM databasename
WHERE calendr_dt = CAST 2018-04-29, 2018-04-22 AS DATE
                                  ^
                    this will be your syntax error

您的方法在以下几个方面存在缺陷:

  1. 您正试图将一个列表插入到一个CAST调用中,这将失败
  2. 您正在针对数组测试列的相等性,这将失败

因此,您可能还需要阅读SQL语法,并在尝试通过python插入值之前生成一个示例查询。在

它可能看起来像这样(未经测试-小心使用):

sql = '''
    SELECT calndr_dt, wk_of_mnth
    FROM databasename
    WHERE calendr_dt IN [{:s}]
'''.format(', '.join(
    [
        '\'{:s}\'::DATE'.format(dt.strftime('%Y-%m-%d'))
        for dt in begdtlist
    ]
))

结果是:

SELECT calndr_dt, wk_of_mnth
FROM databasename
WHERE calendr_dt IN ['2018-04-29'::DATE, '2019-04-22'::DATE]

相关问题 更多 >