【问题标题】:How can I query between two dates with the 'date' field is a string?如何使用“日期”字段在两个日期之间查询是一个字符串?
【发布时间】:2012-06-07 21:59:28
【问题描述】:

我在 MySQL 数据库中有一个表,其中包含一个名为“Date”的字段,问题是日期的格式为 DD-MM-YYYY,因此我无法将其作为 DATE 类型字段上传到 MySQL。相反,字段类型是字符串。考虑到这一点,我该如何编写能够产生这种效果的查询 -

SELECT * FROM `table` 
WHERE  (date_field BETWEEN '2010-01-30' AND '2010-09-29')

请记住,'date_field' 不是 DATE 类型,而是字符串。

【问题讨论】:

  • 查看此链接,希望您能找到出路stackoverflow.com/questions/1408285/…
  • date_field 的格式是DD-MM-YYYY 的问题,还是YYYY-MM-DD 的格式?如果是后者,BETWEEN 应该可以工作,因为日期是按字母顺序排列的。

标签: mysql phpmyadmin


【解决方案1】:
SELECT * FROM `table` 
WHERE str_to_date(date_field, '%d-%m-%Y') BETWEEN '2010-01-30' AND '2010-09-29'

SQLFiddle example

编辑

你也可以这样做:

SELECT * FROM `table` 
WHERE cast(substring(date_field, 7, 4) as unsigned) * 10000 + cast(substring(date_field, 4, 2) as unsigned) * 100 + cast(substring(date_field', 1, 2) as unsigned)
BETWEEN 20100130 AND 20100929

【讨论】:

  • 如果你非常偏执,你可以str_to_date()所有字符串,而不仅仅是第一个。
  • 我认为没有必要:)
  • 不幸的是,这个查询没有返回任何结果。我很肯定我在我选择的日期之间有数据。你有什么建议?
  • @jesterII:那是我的错误。在str_to_date 中使用Y 而不是y
  • @juergend 我很抱歉,我在其他解决方案中查看 Hugo 的 SQL fiddle 示例。但是您的编辑效果很好,非常感谢。
【解决方案2】:

把桌子修好!

  1. 添加适当的DATE 数据类型的新列:

    ALTER TABLE `table` ADD new_date_field DATE AFTER date_field;
    
  2. 使用 MySQL 的 STR_TO_DATE() 函数用旧列中保存的日期填充新列:

    UPDATE `table` SET new_date_field = STR_TO_DATE(date_field, '%d-%m-%Y');
    
  3. 删除旧列(如果需要,在其位置重命名新列):

    ALTER TABLE `table` DROP date_field, CHANGE new_date_field date_field DATE;
    
  4. 更改您的应用程序以使用此新列。

【讨论】:

    【解决方案3】:

    在处理过各种格式的日期后,我发现最好将格式转换回数据库格式,或者您自己的一致格式进行处理。我们使用的一个选项是我们自己的日期时间格式,它只是 YYYYMMDDhhmmss,对于闰年等,它总是会正确排序......并且使解析数据变得容易。然后我们可以在用户想要的视图中显示格式,没有任何问题。

    虽然这不是您问题的直接答案,但我发现这在处理来自不同国家/地区的日期和时间格式时可以节省大量时间和麻烦。我们也倾向于节省祖鲁时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      相关资源
      最近更新 更多