【问题标题】:why is MySQL select date not working for different month为什么 MySQL 选择日期不适用于不同月份
【发布时间】:2016-12-23 12:17:31
【问题描述】:

当我还在学习 PHP 和 MySQL 时,我创建了一个非常古老的数据库。 如果我填充:

SELECT * FROM Jobs WHERE (date BETWEEN 'Aug.01 2016' AND 'Aug.31 2016')

我实际上可以填充行

Found rows: 4 Warnings: 0 Duration for 1 query: 0.000 sec.

但是一旦我改变了我的月份(将范围从 8 月 1 日移动到 7 月 1 日):

SELECT * FROM Jobs WHERE (date BETWEEN 'Jul.01 2016' AND 'Aug.31 2016')

我什么也没得到,所以 7 月 1 日至 8 月 31 日的范围包括 8 月 1 日至 8 月 31 日(来自上一个示例),它应该至少填充 4 行

Found rows: 0 Warnings: 0 Duration for 1 query: 0.016 sec.

有没有一种方法可以填充这些行,即使它们有不同的月份?

【问题讨论】:

  • date 是什么数据类型?是DATETIME 还是只是一个字符串?
  • @Machavity 它是VARCHAR 所以格式实际上是一个类似于Jul.01 2016的字符串
  • 你需要考虑切换到DATETIME。在这样的日期进行索引查找会很昂贵
  • 在数据库中正确存储日期date types,这将使生活变得轻松一百万倍
  • 所以,看来我需要用DATETIME 创建一个新表并重新生成正确的值...谢谢!

标签: php mysql sql-server date


【解决方案1】:

您需要先将日期字符串转换为有效日期:

SET @date := 'Aug.01 2016';

SELECT STR_TO_DATE(@date,'%M.%d %Y');

输出(yyyy-mm-dd): 2016-08-01

现在在您的查询中使用它来搜索日期在2016-07-01 & 2016-08-31 之间的结果。

SELECT 
*
FROM Jobs 
WHERE STR_TO_DATE(date,'%M.%d %Y') BETWEEN '2016-07-01' AND '2016-08-31';

注意:但日期应存储在 date 数据类型列中。是时候将date 列的datatype 转换为date 了。

为此,请按照以下步骤操作:

ALTER TABLE Jobs
ADD new_date_column date;

UPDATE Jobs 
SET new_date_column = STR_TO_DATE(date,'%M.%d %Y');

ALTER TABLE Jobs DROP COLUMN `date`;

ALTER TABLE Jobs CHANGE COLUMN `new_date_column` `date` date;

简单的步骤:

  1. Jobs 类型为date 的表中添加一个新列。

  2. 现在使用 date 列中的值更新此新列 转换为有效日期后。

  3. 您不需要 date 列。所以放弃吧。

  4. 现在将新创建的列重命名为date

【讨论】:

    猜你喜欢
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多