【问题标题】:Why is MySQL retrieving a DATE data type with timezone conversion added?为什么 MySQL 检索添加了时区转换的 DATE 数据类型?
【发布时间】:2020-08-27 07:54:46
【问题描述】:

格式为“YYYY-MM-DD”的字符串正在存储到 MySQL 中的 DATE 字段。使用 SELECT 检索表时,它总是返回实际存储日期前一天的错误日期,例如,'YYYY-MM-DDT21:00:00.000Z' UTC 时间, 什么时候应该返回没有时区的基本日期,因为 DATE 数据类型不存储任何时间信息,即“YYYY-MM-DD”。 为什么它返回带有时区信息的日期以及如何将其删除?

日期字段的标签配置:'movedate' date DEFAULT NULL。引擎是 InnoDB 和 CHARSET=latin1

【问题讨论】:

  • 可以添加表配置吗?使用SHOW CREATE TABLE 'table_name' 输出更新您的问题

标签: mysql node.js date


【解决方案1】:

mysql 模块(我猜你正在使用!),声明到 JavaScript 日期对象的转换使用连接配置的 timezone 属性,详细信息在这里:https://www.npmjs.com/package/mysql#connection-options

在任何情况下,如果日期以 UTC 格式存储,我们可以使用连接配置的 timezone 属性指定它们按原样检索,如下所示:

const mysql = require('mysql');
    
const db = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "****",
    database: 'test_db',
    timezone: 'Z'
});

db.query("SELECT * from dates", (err, result) => { 
    if (err) {
        console.error("An error occurred:", err);
    } else { 
        console.log("Results:", result);
    }
})

【讨论】:

  • 这似乎可以工作并保留原始日期,并修复了在实际存储数据前一天返回日期的问题(已编辑问题),但它仍然将 T00:00:00.000Z 格式保留为字符串的结尾。虽然删除最后一部分已经不是什么大问题了。
  • 我担心的是,由于数据库包含其他带有时间信息的日期和时间戳数据类型,将时区“Z”添加到配置中会如何影响其余部分?
  • 这是一个合理的担忧,因为您在配置级别而不是在查询级别进行更改。值得测试以确定此更改的影响。一个可以为此查询创建单独的连接,以避免影响其他查询。
【解决方案2】:

我通过将日期保存到变量中并从那里使用 JavaScript 的日期获取方法解决了这个问题,例如获取月份()。 get 方法似乎将日期更改回原始日期。

所以如果数据库中存储的日期是2007-02-01,检索到的日期是2007-01-31T22:00:00.000Z,那么使用日期方法,结果是2007-02-01

由于从 DB 中检索到的日期是有效的日期对象,因此 JavaScript 的 get 方法将分别获取每一天/月/年。

【讨论】:

    猜你喜欢
    • 2019-07-13
    • 2018-04-04
    • 2019-08-17
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 2019-09-16
    • 2015-07-06
    • 1970-01-01
    相关资源
    最近更新 更多