【问题标题】:SQL date format and quoting confusionSQL 日期格式和引用混淆
【发布时间】:2015-02-20 17:04:16
【问题描述】:

我有如下测试记录:

以下查询结果为0条记录:

SELECT * FROM `events_dates` WHERE `start_date` = 21-12-2014

但以下查询结果为 1 条记录:

SELECT * FROM `events_dates` WHERE `start_date` > 21-12-2014

我对此有点困惑。

作为一个附带问题:如果我不使用时间字段,是否可以使用“日期”类型,还是您仍然愿意选择使用“日期时间”?

【问题讨论】:

    标签: mysql sql datetime


    【解决方案1】:

    您必须以'YYYY-MM-DD' 的格式对日期文字进行单引号引用。否则,MySQL 解释的是算术表达式(整数减法):

    21 - 12 - 2014 = -2005
    

    负整数 -2005 被转换为有效的日期值 0000-00-00 00:00:00,这解释了为什么使用 > 的查询会返回一行。

    正确的 SQL 表达式是:

    SELECT * FROM `events_dates` WHERE `start_date` = '2014-12-21'
    

    关于使用DATE 类型而不是DATETIME,是的,如果你知道你从不打算使用时间,我会认为可以不使用时间部分。不过我承认,在大多数情况下,我确实使用DATETIME 来实现未来的可扩展性。这真的取决于你未来的需求。

    如果关注的是存储空间的优化以避免使用DATETIME 存储时间,请考虑该表有多大潜力变得非常大,然后再担心优化它(它必须非常大 重要)。如果您确实使用DATETIME,您可能会发现自己经常使用DATE() 函数在查询时截断值。我认为这只是一个非常小的不便。

    如果start_dateDATETIME 列,则相同的查询可以使用DATE() 截断时间段:

    SELECT * FROM `events_dates` WHERE DATE(`start_date`) = '2014-12-21'
    

    【讨论】:

    • 很好,没有更多问题 :-) 我会在 8 分钟内接受。
    【解决方案2】:

    MySql 日期字段只支持YYYY-MM-DD 日期格式,这个查询给你正确的结果

    SELECT * FROM `events_dates` WHERE `start_date` > '2014-12-21'
    

    虽然用(“或')引用日期字段

    【讨论】:

      猜你喜欢
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多