You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:06:22