沙滩星空的博客沙滩星空的博客

MySQL查询对日期数据进行格式化

问题分析

使用 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

未经允许不得转载:沙滩星空的博客 » MySQL查询对日期数据进行格式化

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址