【问题标题】:In SQL how to compare date values?在 SQL 中如何比较日期值?
【发布时间】:2008-11-25 19:25:41
【问题描述】:

使用 MySQL 语法并有一个包含如下行的表:

mydate DATETIME NULL,

有没有办法做类似的事情:

... WHERE mydate<='2008-11-25';

我正在尝试,但没有真正让它发挥作用。

【问题讨论】:

    标签: sql mysql compare where


    【解决方案1】:

    呃,WHERE mydate&lt;='2008-11-25' 的方法。应该可以的。

    您是否收到错误消息?您使用的是旧版本的 MySQL 吗?

    编辑:以下在 MySQL 5.x 上对我来说很好

    create temporary table foo(d datetime);
    insert into foo(d) VALUES ('2000-01-01');
    insert into foo(d) VALUES ('2001-01-01');
    select * from foo where d <= '2000-06-01';
    

    【讨论】:

    • 在我的 PostgreSQL DBMS 上,确实可以正常工作。可能是 MySQL 的弱点?
    • Err,它也适用于 MySQL。 :) 我只是试了一下以确保我没有疯。你使用 fmfs 的 MySQL 是什么版本?你有错误吗?
    【解决方案2】:

    没关系找到答案。任何愿意回复的人都一样。

    WHERE DATEDIFF(mydata,'2008-11-20') >=0;
    

    【讨论】:

    • 这看起来很慢:函数调用和表中每一行的隐式转换。必须有一种方法可以更直接地比较日期。
    【解决方案3】:

    在标准 SQL 语法中,您可以使用:

    WHERE mydate <= DATE '2008-11-20'
    

    也就是说,关键字 DATE 应该在字符串之前。但是,在某些 DBMS 中,您不需要那么明确。系统将自动将 DATE 列转换为字符串,或将字符串转换为 DATE 值。如果将 DATE 转换为字符串,名义上会有一些有趣的含义 - 如果您碰巧有第一个千年的日期 (0001-01-01 .. 0999-12-31) 并且前导零被省略格式化系统。

    【讨论】:

    • 请注意,如果所有日期都采用如图所示的 ISO 8601 格式,则字符串比较将起作用(这是 ISO 8601 的一项功能)。
    • 如果包括前导零,是的。理论上,如果您的日期早于 1000-01-01,则 DBMS 可能会省略前导零。我不确定这很有可能,但更有趣的事情已经知道了。 Oracle 支持日期 BCE (BC);这些不能作为字符串可靠地比较。
    【解决方案4】:

    你可以添加时间组件

    WHERE mydate<='2008-11-25 23:59:59'
    

    但是如果 mydate 是“2008-11-25 24:59:59”,那么在 DST 切换日期可能会失败,因此在下一个日期之前获取所有内容可能是最安全的:

    WHERE mydate < '2008-11-26 00:00:00'
    

    【讨论】:

      【解决方案5】:

      您的问题可能是您正在处理 DATETIME 数据,而不仅仅是日期。如果一行的 mydate 为“2008-11-25 09:30 AM”,那么您的 WHERE mydate 将不会返回该行。 '2008-11-25' 的隐含时间为 00:00(午夜),因此即使日期部分相同,它们也不相等,并且 mydate 更大。

      如果您使用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-01
        • 2015-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多