【问题标题】:MYSQL Select between date breaking on yearMYSQL 在年份的日期中断之间进行选择
【发布时间】:2012-12-19 04:05:30
【问题描述】:

我创建了一个用户提交的简单表单。一切都很好,但我最近发现

SELECT * FROM `Forms` WHERE `Date` BETWEEN '{$startDate}' AND '{$endDate}' 

Date 是类型TEXT。我需要它是文本,因为我认为以MM/DD/YY 格式显示所有内容会更容易。现在我不想冒险更改数据类型,因为表单工作正常。

日期列示例

01-03-2013
01-04-2013
07-25-2012
08-01-2012
08-01-2012
08-01-2012
08-01-2012

工作查询的示例

SELECT * FROM `Forms` Where `Date` Between '01-08-2012' and '12-12-2012'

查询不工作的例子

SELECT * FROM `Forms` Where `Date` Between '01-08-2012' and '01-04-2013'

如果年份改变,它会损坏的任何原因?即使年份发生变化,我怎样才能让它工作。

【问题讨论】:

  • 因为它是文本 01-04.... 在 01-08 之前......将其转换为日期

标签: php mysql date select


【解决方案1】:

你可以这样做

SELECT * FROM `Forms` 
WHERE str_to_date(`Date`, '%d-%m-%Y') BETWEEN '2012-01-30' AND '2013-09-29'

DEMO HERE

编辑:

如果你想在这里修理你的桌子,你怎么做

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

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

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

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

【讨论】:

  • 编辑在这里展示它是如何工作的,如果你想改变你的表结构。
  • 谢谢...SELECT * FROM Forms` WHERE str_to_date(Date, '%d-%m-%Y') BETWEEN '2012-01-30' AND '2013-09- 29'` 工作就像一个魅力。我会将数据类型更改说明保存在书签中。我很确定每个人都猜到我对 SQL 一无所知。不遵循 SQL 表中的标准格式是相当愚蠢的。非常感谢你们为我节省了几个小时的头撞
【解决方案2】:

试试这个:

select * from "forms" where Date('column_name') between '' and ''

【讨论】:

    【解决方案3】:

    如果您担心它会损坏然后导出数据库然后进行更改。您不会得到您期望的结果,因为它是 TEXT 字段而不是日期字段。 MySQL按字符排序。因为它正在查看第一个字符,然后是下一个,然后是下一个。

    就像 navnav 说的那样它不会损坏,但会做一个备份,只是装箱。

    至于仅显示日期,您可以在空间上explode() 以仅获取日期:

    <?php
    
    list($date, $time) = explode(" ", $datetime, 2);
    echo $date;
    
    ?>
    

    【讨论】:

      【解决方案4】:

      因为您的列是 TEXT 列 MySQL 将使用字母比较。

      01-08 出现在 01-04 之前,所以实际上已经是月份部分了。

      要解决此问题,请将列转换为 DATE 类型或将日期顺序反转为 YYYY-MM-DD,在这两种情况下,BETWEEN 都应该正常工作。

      【讨论】:

      • 听起来很有趣,我们可以在查询中这样做吗?例如 Select * from FORMS where Reverse(Date) between 2012-12-12 and 2013-01-04 ?
      【解决方案5】:

      试试这个::

      SELECT * FROM `Forms` Where str_to_date(`Date`, '%d/%m/%Y') Between '01-08-2012' and '12-12-2012'
      

      【讨论】:

      • 如果您有一个大型数据集,动态转换日期可能不是一个好主意。但是,如果您的数据集很小,这会很快。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多