问题分析
使用 Go语言 的 xorm.io/xorm
包进行数据分析时,SQL查询报错:
[xorm] [info] 2022/12/02 17:40:35.242861 [SQL] select created_at, product_id, time_before, quantity_before, quantity_after FROM product_quantities WHERE created_at > "2022-11" AND product_id = 1509097783963947008 [] - 107.0425ms
panic: parsing time "2022-11-02T00:10:11.89+08:00" as "2006-01-02 15:04:05.00000000": cannot parse "T00:10:11.89+08:00" as " "
报错大概是说, SQL 查询结果的日期数据解析错误
。
提示查询结果的日期格式为: 2022-11-02T00:10:11.89+08:00
, 解析的格式却是: 2006-01-02 15:04:05.00000000
mysql 数据表的 created_at
字段的数据类型为: datetime
。
问题解决
印象中,隐约记得原生的SQL查询有数据格式化显示的函数。应该可以格式化SQL查询结果。就去网上查了下。
有个函数叫 DATE_FORMAT
, 使用方法为: SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')
故修复SQL语句如下:
select created_at, product_id, time_before, quantity_before, quantity_after FROM product_quantities WHERE created_at > "2022-11" AND product_id = 1509097783963947008
改为:
select DATE_FORMAT(created_at,"%Y-%m-%d %H:%i:%s") AS created_at, product_id, DATE_FORMAT(time_before,"%Y-%m-%d %H:%i:%s") AS time_before, quantity_before, quantity_after FROM product_quantities WHERE created_at > "2022-11" AND product_id = 1509097783963947008
注: 数据为 datetime
类型,SQL的where子句应该为 created_at > "2022-09"
不应该为: created_at > "2022-9"
其他函数
# 获取当时时间戳(10位长度)
select UNIX_TIMESTAMP(now())
SELECT UNIX_TIMESTAMP()
# 将时间戳格式化为 YYYY-mm-dd HH:ii:ss 格式日期(默认)
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP())
# 将时间戳格式化日期(指定日期格式化格式)
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),'%Y-%m-%d %H:%i:%s')
# 处理13位的时间戳转换
SELECT FROM_UNIXTIME(1627311955999/1000,'%Y-%m-%d %H:%i:%s')
MySQL 日期格式化 https://zhuanlan.zhihu.com/p/393858866