【问题标题】:How do I automate date in SQL query using Python如何使用 Python 自动执行 SQL 查询中的日期
【发布时间】:2017-10-09 11:43:40
【问题描述】:

我有 SQL 连接并命名为 db_connection,我每周运行一次

tran= pd.read_sql('SELECT order_id, p.user_id, p.barcode, title, o.timestamp, amount, p.name, qty FROM transactions t left join orders o on t.order_id = o.id left join products p on t.product_id = p.id where date(o.timestamp)<=\'2017-09-27\' and date(o.timestamp)>=\'2017-09-21\' and p.user_id = \'63165\' ', con=db_connection)

tran2= pd.read_sql('SELECT order_id, p.user_id, p.barcode, title, o.timestamp, amount, p.name, qty FROM transactions t left join orders o on t.order_id = o.id left join products p on t.product_id = p.id where date(o.timestamp)<=\'2017-09-27\' and date(o.timestamp)>=\'2017-09-21\' and p.user_id = \'62345\' ', con=db_connection)

...

tran22= pd.read_sql('SELECT order_id, p.user_id, p.barcode, title, o.timestamp, amount, p.name, qty FROM transactions t left join orders o on t.order_id = o.id left join products p on t.product_id = p.id where date(o.timestamp)<=\'2017-09-27\' and date(o.timestamp)>=\'2017-09-21\' and p.user_id = \'78345\' ', con=db_connection)

比如我想把日期全部改成date(o.timestamp)&lt;=\'2017-10-04\' and date(o.timestamp)&gt;=\'2017-09-28\',但是这需要时间,而且容易出错。有没有办法让日期只被调用一次?

【问题讨论】:

    标签: python mysql pandas


    【解决方案1】:

    Python

    虚拟解决方案是使用占位符来编辑单个条目:

    start = # evaluate or hardcode date
    end = # evaluate or hardcode date
    
    tran = pd.read_sql('... where date(o.timestamp)<=\'{END}\' and date(o.timestamp)>=\'{START}\' ...'.format(START=start, END=end), con=db_connection)
    ...
    tran1 = ...
    

    熊猫的参数

    start = # evaluate or hardcode date
    end= # evaluate or hardcode date
    tran = pd.read_sql('... where date(o.timestamp)<=%(end)s and date(o.timestamp)>=%(start)s ...',
                   con=db_connection, params={"start":start, "end":end})
    

    CURDATE

    使用函数CURDATE,您可以对查询进行参数化。例如,如果您每周一运行查询,并希望提取上周(周一至周日)的数据,您可以设置条件:

    WHERE DATE(o.timestamp)<=(CURDATE() - INTERVAL 1 DAY) and DATE(o.timestamp)>=(CURDATE() - INTERVAL 8 DAY)
    

    这显然取决于您何时运行查询,但如果提取由调度程序自动执行,则效果很好。

    或者,将它与DAYOFWEEK 结合起来,我们可以使它独立于它运行的星期几(再次:考虑上周一到周日)):

    WHERE DATE(o.timestamp) >= (CURDATE() - INTERVAL (DAYOFWEEK(CURDATE())+5) DAY) AND DATE(o.timestamp) <= (CURDATE() - INTERVAL (DAYOFWEEK(CURDATE())-1) DAY)
    

    显然,您必须根据需要调整日偏移量。

    【讨论】:

    • 这太棒了,这就是解决方案
    • 您要找的是谁?
    • 你的第一个解决方案不是我预期的解决方案,但最终的答案给了我想法
    猜你喜欢
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 2019-08-02
    • 1970-01-01
    • 2012-07-13
    相关资源
    最近更新 更多