【问题标题】:MySQL DATE Behavior & Result IssuesMySQL DATE 行为和结果问题
【发布时间】:2020-04-20 16:57:32
【问题描述】:

MySQL 版本:8.0.18 字符集:utf8mb4 排序规则:utf8mb4_unicode_ci

我正在整理一个将“当前”日期条目转换为 DATE 条目的规则集(因为我们将日期存储为实际的 DATE 数据类型,而不是文本)。

在这样做的过程中,我发现了一些非常奇怪的东西。我想要一个规则集,其中 00-00-2020(例如)代表“现在”。

当我执行这个时:

SELECT date(CONCAT(YEAR(NOW()),'-00-00'));

结果是“0/0/2020”作为 DATE 结果值。

但是,当我在存储过程中执行此操作时:

SET out_result_formatted_date = CONCAT(YEAR(NOW()),'-00-00');

结果始终为“1/1/0001”。注意 out_result_formatted_date 是 DATE 类型。另请注意,如果我将 DATE 放在 CONCAT(存储过程的)前面,结果是相同的。

到底为什么我会从应该是完全相同的代码中得到两个不同的结果?

【问题讨论】:

    标签: mysql date concat


    【解决方案1】:

    我对您遇到问题并不感到惊讶,因为 2020-00-00 是一个不存在的虚假日期。话虽如此,更好的方法是使用DATE_FORMAT

    SELECT DATE_FORMAT(NOW(), '%Y-01-01')
    SET out_result_formatted_date = DATE_FORMAT(NOW(), '%Y-01-01')
    

    这会在当年的第一天和第一个月构建一个有效的日期文字。

    【讨论】:

    • 所以这里的问题是我需要一个假的日期输入;因为我不想使用 NULL 来表示“现在”,因为有时日期会丢失。所以我希望使用虚构的日期(例如“2020-00-00”)。从技术上讲,我可以使用返回的 1/1/0001,但我想存储获取 PRESENT 值的年份,这就是我按照我的方式编写代码的原因。不幸的是,您的回复没有说明为什么我使用相同的代码得到两个完全不同的结果。
    • 最终我需要的是 SELECT date(CONCAT(YEAR(NOW()),'-00-00')) 提供的内容,因为它让我知道当前条目的年份。如前所述,问题在于存储过程返回的结果与简单查询完全不同。
    • 你不应该需要一个虚假的日期。使用NULL 或创建一个新的状态列。关于您的错误,查询和过程可能与错误的行为方式不同。在任何情况下,都不要尝试使用2020-00-00 作为日期。
    • 是的,这里的问题是 2020-00-00 在技术上是一个错误,但 MySQL 将其作为查询返回,没有错误,误导了它的有效性;但是您是对的,尝试将其直接插入表中失败了。我只是希望在不创建新列的情况下存储“现在”的年份。我们决定将“当前”日期映射到 01/01/0001。节省数据,效率高。
    猜你喜欢
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多