【问题标题】:How can I use date arithmetic in MySQL when one of the two dates stores only the year but not month or day?当两个日期之一仅存储年份而不存储月份或日期时,如何在 MySQL 中使用日期算术?
【发布时间】:2020-08-16 18:38:59
【问题描述】:

https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html

我们可以看到有些函数不喜欢不完整的日期:

某些日期函数可以用于“零”日期或不完整的日期,例如“2001-11-00”,而其他函数则不能。

我想像这样减去两个日期:

SELECT DATEDIFF(CURRENT_DATE(), birthdate)

根据 phpMyAdmin 控制台,birthdateDATE 列。

但有些出生日期没有月份或日期,例如'1874-00-00'。您无法获取天数差异,因为天数未知。

有没有办法告诉它假设 1 月 1 日或什么?还是我需要自己建立日期以便它识别它?

我真的只需要大概的年差。但我得到NULL

谢谢。

【问题讨论】:

  • 忘了说结果是NULL。
  • 生日列的数据类型是什么?
  • 一个普通的旧日期。我还可以访问存储文本表示的另一列,但这似乎是多余的。不知道为什么它也在那里。
  • 如果数据类型是 DATE,那么它也包含月份和日期。
  • 有没有办法告诉它假设 1 月 1 日或什么? 告诉?不...但您可以构建一个表达式,将日期组件中的零替换为其默认值。

标签: mysql sql date datetime


【解决方案1】:

仅使用您所在领域的年份并进行简单的减法:

SELECT YEAR(NOW())-YEAR(birthdate) FROM YOUR_TABLE_NAME;

它适用于有效日期和无效日期

【讨论】:

    【解决方案2】:

    如果您有'1874-00-00' 之类的日期,则该列的数据类型为VARCHAR,除非您禁用了默认启用的NO_ZERO_IN_DATE 模式。

    我真的只需要大概的年差

    如果年份始终包含在您的日期中,并且开头是 4 位数字,那么您只需从当前年份中减去您的日期:

    SELECT birthdate,
           YEAR(NOW()) - birthdate AS age
    FROM tablename
    

    MySql 会将 birthdate 隐式转换为整数,该整数就是年份。

    对于这个示例数据:

    CREATE TABLE tablename(birthdate VARCHAR(20));
                                             
    INSERT INTO tablename(birthdate) VALUES
    ('1950-05-15'), ('1960-08-00'), ('1970-00-00');
    

    结果将是:

    | birthdate  | age |
    | ---------- | --- |
    | 1950-05-15 | 70  |
    | 1960-08-00 | 60  |
    | 1970-00-00 | 50  |
    

    或者,如果您想在birthdates 是有效日期时更精确:

    SELECT birthdate,
           COALESCE(
             TIMESTAMPDIFF(YEAR, birthdate, NOW()),
             YEAR(NOW()) - birthdate
           ) age  
    FROM tablename
    

    请参阅demo

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-27
    • 2023-04-11
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    相关资源
    最近更新 更多