服务端如何将SQL DATE转换为YYYY-MM-DD格式?
解决服务端将DATE类型字段转为YYYY-MM-DD格式的方法
原因说明
数据库里的DATE类型本身只存储年月日,但Node.js的数据库驱动通常会把它转换成JavaScript的Date对象,而这个对象会带上时区对应的时间部分,所以你拿到的是类似YYYY-MM-DDT22:00:00.000Z的格式。下面是几种服务端层面的解决方式:
1. 数据库查询时直接格式化(推荐)
在SQL查询语句里就把日期转成字符串格式,这样拿到的结果直接就是YYYY-MM-DD,不用后续处理。根据你用的数据库,写法不同:
MySQL/MariaDB
SELECT DATE_FORMAT(start_date, '%Y-%m-%d') AS start_date FROM your_table;
PostgreSQL
SELECT TO_CHAR(start_date, 'YYYY-MM-DD') AS start_date FROM your_table;
SQL Server
如果之前用FORMAT没生效,试试用CONVERT更稳妥:
SELECT CONVERT(VARCHAR(10), start_date, 23) AS start_date FROM your_table;
(注:FORMAT(start_date, 'yyyy-MM-dd')理论上也能生效,但CONVERT性能更好,适合大数据量查询)
2. Node.js查询结果后处理
如果不想改SQL语句,可以在拿到查询结果后,手动把Date对象转成目标格式:
方法一:直接截取ISO字符串的前10位
// 假设查询返回的是rows数组 const formattedRows = rows.map(row => { return { ...row, // 把Date对象转成ISO字符串后,分割出日期部分 start_date: row.start_date.toISOString().split('T')[0] }; });
方法二:用原生Intl.DateTimeFormat格式化(更严谨)
const formattedRows = rows.map(row => { return { ...row, start_date: new Intl.DateTimeFormat('en-CA', { year: 'numeric', month: '2-digit', day: '2-digit' }).format(row.start_date) }; });
en-CA区域的日期格式刚好是YYYY-MM-DD,也可以自定义格式选项来适配需求。
3. 配置数据库驱动直接返回字符串
有些数据库驱动支持配置,让DATE类型字段直接返回字符串而非Date对象:
以mysql2驱动为例
在创建连接时添加dateStrings配置:
const mysql = require('mysql2/promise'); const connection = await mysql.createConnection({ host: '你的数据库地址', user: '用户名', password: '密码', database: '数据库名', // 指定DATE类型字段返回字符串 dateStrings: ['DATE'] });
这样查询到的start_date直接就是YYYY-MM-DD格式的字符串,无需额外处理。
内容的提问来源于stack exchange,提问作者sassy.M
相关产品推荐
相关产品推荐

