2

如何使用 python date 按天在 mySQL 中提取数据?说我想要day1并且day2(或后天day1)迭代n多次

所以我需要“where”SQL语句中的日期在每次迭代中看起来像下面的列表(n次)

day1 >= '2012-01-01'  and  day2 < '2012-01-02'    ( n = 1 )
day1 >= '2012-01-02'  and  day2 < '2012-01-03'    ( n = 2 )
.
.
day1 >= yesterday    and day2  < today            ( n times ) 

.

Start_date = '2012-01-01'   <- How can I write this in python
End_date = Today()   <- and this 

这样写:

for each iteration ..
    con.execute("select * from table where date >= day1 and date < day2" )
4

3 回答 3

5

您需要datetime模块:-

import datetime
start = datetime.date(2012,01,01) 
next = start + datetime.date.resolution

while next <= datetime.date.today():
    print start, next

    con.execute("""
        select * from table where date >= %s and date < %s
    """, (start, next))

    start = next
    next = start + datetime.date.resolution

重要通知:我更新了答案以解决一个严重的问题。永远不要使用字符串格式(又名%)来构建 SQL 查询,因为它会引发包括SQL 注入在内的严重问题。使用Python-<db_driver>几乎所有 RDMB 都提供相同语法的 api

execute("select * from blah where x=%s AND y=%s", (x, y))
                                     ^       ^  ^
                                     1       1  2

1] 没有引号,
2] 没有字符串格式

于 2012-09-21T16:08:32.457 回答
2

datetime类与strftime函数一起使用。

该类datetime用于构建表示特定日期和时间的对象。该strftime函数根据您选择的格式将其转换为特定的字符串。

根据MySQL 的文档,标准的日期时间格式是YYYY-MM-DD HH:MM:SS.

这是一个应该有效的示例:

day1 = datetime.datetime(2012, 1, 1).strftime('%Y-%m-%d %H:%M:%S')
day2 = datetime.datetime(2012, 1, 2).strftime('%Y-%m-%d %H:%M:%S')
con.execute("select * from table where date >= %s and date < %s", (day1, day2))

如果您想进行其他查询,只需datetime.datetime在循环的每一轮中创建适当的对象。例如:

for i in xrange(1, 10):
    # ...
    day2 = datetime.datetime(2012, 1, i).strftime('%Y-%m-%d %H:%M:%S')
    # ...
于 2012-09-21T16:01:30.977 回答
1

使用datetime.date对象。它们是美妙的东西,因为有了它们,您可以:

  • 轻松计算今天 ( dt.date.today()),
  • 轻松计算第二天 ( start + dt.timedelta(days = 1),
  • 比较日期(例如start < end
  • 将它们直接喂入con.execute. 无需将它们预先格式化为字符串。

import datetime as dt
start = dt.date(2012,1,1)
end = dt.date.today()

while start < end:
    nextday = start + dt.timedelta(days = 1)
    con.execute("select * from table where date >= %s and date < %s",
                (start, nextday))

    start = nextday
于 2012-09-21T16:02:30.357 回答