将python日期列表传递给sql query where子句

时间:2018-05-26 15:22:23

标签: python sql timestamp

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

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

print(begdtlist)返回以下内容。

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'). 

日期是将类型转换为时间戳。

我将此列表传递给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"

我不确定它为什么会作为时间戳出现。我只需要引号中的日期部分。任何指导实现这一点将不胜感激。

1 个答案:

答案 0 :(得分:1)

您正在使用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'))

这会生成以下输出:

[Timestamp('2018-04-29 00:00:00'), Timestamp('2019-04-22 00:00:00')]
2018-04-29
2019-04-22

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

顺便说一下,pandas将您的日期转换为自己的Timestamp对象是完全没问题的,因为它们需要DataFrame交互和聚合等接口,这些接口不存在在常规python DateDatetime对象中。

但是,你无法在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. 您正在测试列与数组的相等性,这将失败
  3. 因此,您可能还想阅读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]