【问题标题】:Date/String Discrepancy in MySQL QueriesMySQL 查询中的日期/字符串差异
【发布时间】:2015-10-12 15:47:20
【问题描述】:

我注意到 MySQL 中关于 WHERE 子句中带有日期的查询的一些奇怪行为。我对 MySQL 还很陌生,所以我想知道这是否是预期的行为,或者我可以做些什么来解决这个问题。

以下查询返回表中的所有内容,就好像根本没有日期参数一样。我得到日期为 1997 年和 2015 年以上的结果。

select * from shipments where file_creation_date > 9/12/2014

select * from shipments where file_creation_date > 2014-9-12

select * from shipments where file_creation_date > 2014-09-12

以下查询可以正常工作:

 select * from shipments where file_creation_date > '2014-9-12'

 select * from shipments where file_creation_date > '2014-09-12'

注意日期是如何格式化为字符串的。该列的数据类型为 DATE,格式为 yyyy-mm-dd。您希望实际日期可以正常工作,但由于某种原因,它只有在我将其设为具有正确格式的字符串时才有效。

我们目前使用的数据库接受几乎任何格式的日期,如日期或字符串,并且查询工作正常。当数据类型为 DATE 时,为什么 MySQL 只接受格式非常明确的字符串?我可以做些什么来改变这一点吗?

谢谢

【问题讨论】:

  • 我知道的所有数据库都接受日期作为字符串(好吧,一个例外是 MS Access)。

标签: mysql string date types


【解决方案1】:

您的前三个查询是将日期与计算得出的数值进行比较 - 9/12/2014 = 0.00037239、2014-9-12 = 1993 等。日期将转换为格式为 yyyymmddhhmmss.sss (20141209000000.000) 的数值并将两者进行比较。

当以字符串形式输入日期时,MySQL 会隐式转换为正确的数据类型并比较时间 - 给出预期的结果。

MySQL 为何这样做的问题的答案是因为它就是这样设计的——按照标准 SQL,日期以字符串形式输入。

如果您想使用不同的时间格式,请查看有关日期和时间函数的 MySQL 文档:https://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html

注意,当使用 STR_TO_DATE 等函数时,您需要知道要转换的确切格式 - 否则您将在返回日期时得到空值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    相关资源
    最近更新 更多