关于mysql和python跨年周以及当前周的计算问题

在写某个后端时,需要使用python的pymysql从数据库获取上周的数据 然而数据总是不对,bug找了两三个小时才找出来,下面是bug出现的原因,以及关于mysql和python周数的计算方法的总结。


python代码中sql语句的where部分:

“WHERE YEARWEEK(date_format(commit_time,’%%Y-%%m-%%d’)) = YEARWEEK(now())- 1”

语句意思是,把当前时间转换为周数,再把数据库中相应datetime字段也转换为周数,两者之间相差1即可。 当前日期是2018/4/15星期日。 在python中通过datetime.datetime.now().isocalendar()[1] 可以得到当前周数是15; 通过上述sql语句select出上周数据后,在python中选出了mysql返回的数据中时间最靠后的一条数据,对该数据的时间项利用isocalendar()求周数。 然而上述python程序返回的结果也是15(本应该是上周的周数14)。 所以就考虑到很可能是python和mysql计算周数的方式不同,而今天恰巧是周日,有可能是SQL将今天算作了新的一周,即第16周,所以返回的上周数据在python中计算的周数为15。 在mysql中运行语句SELECT YEARWEEK(now()); 结果j截图如下 即显示的是当前时间为2018年第15周。 如果按照周日算作新的一周,当前应该是第16周才对。 进一步查阅网上的万年历 也显示今天为第十五周。 很让人费解。 那么下面通过查看sql语句查询结果的数据情况发现,数据中最靠后的日期的2018-4-14 23:17:32, 即为前一天。 在mysql中执行SELECT YEARWEEK(‘2018-4-14 23:17:32’); 结果是201814, 即第14周。 后来经过不断尝试发现,mysql不仅把周日当做了新的一周,而且是把每年的第一个周日后的那一周当做第一周。 举个例子 这是2018年1月的日历,在mysql中,1月7号到1月13号才算做是2018年第1周,1月1号到1月6号还算作是2017年的第53周。 而在python中,1月1号到1月7号算作是第1周。 所以在python代码中执行上述语句返回结果是4月8号(星期日)到4月14号(星期六)的数据,而python取了最后一条数据来计算周数,即计算4月14号的周数。 所以会导致在上述bug的产生。