MySQL整数时间转yyyy-mm-dd 用pandas读指定时段数据报错解决
报错原因
你的代码触发错误是多个问题叠加导致的:
- SQL子句顺序错误:标准SQL要求
FROM子句必须写在WHERE子句之前,你当前写法把WHERE放在FROM前面,数据库解析阶段就会直接抛出语法错误。 - 同层查询引用SELECT别名不生效:SQL的执行顺序是
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY,WHERE阶段执行时,你在SELECT里定义的date别名还没生成,根本识别不到。 - 时间筛选逻辑冗余低效:你的
time字段本身是整型时间戳,没必要转成字符串后再做区间匹配,直接比对整型时间戳不仅能避免格式匹配的坑,还能命中字段索引,查询效率高很多。 - 额外注意:
table是SQL标准保留字,如果你真的用table当表名,必须用反引号包裹成`table`才能正常识别,不然也会报语法错。
修正方案
2019-2020年对应的秒级Unix时间戳区间为1546272000(2019-01-01 00:00:00,东八区)到1609459199(2020-12-31 23:59:59,东八区),如果你的字段存的是毫秒级时间戳,把数值乘1000即可,推荐使用的高性能读取代码如下:
import pandas as pd # 秒级时间戳版本 sql = """ SELECT *, date_format(from_unixtime(time), '%Y-%m-%d') AS date FROM `table` -- 表名如果不是table直接替换即可 WHERE time BETWEEN 1546272000 AND 1609459199 """ df = pd.read_sql(sql, db)
如果你存的是毫秒级时间戳,需要把
from_unixtime(time)改成from_unixtime(time/1000),同时WHERE条件里的两个时间戳值改为1546272000000和1609459199000。
如果你非要用日期字符串做筛选(性能差,不推荐),需要嵌套一层子查询,先把日期派生字段算出来再做筛选,写法如下:
sql = """ SELECT * FROM ( SELECT *, date_format(from_unixtime(time), '%Y-%m-%d') AS date FROM `table` ) t WHERE date BETWEEN '2019-01-01' AND '2020-12-31' """
内容的提问来源于stack exchange,提问作者Sadcow
相关产品推荐
相关产品推荐

