Mysql日期间隔

时间:2012-03-14 18:12:58

标签: mysql database datetime date null

我正在尝试选择在特定时间段内的行:

$sql = mysql_query(" SELECT * FROM table WHERE ... AND 
       date BETWEEN ('$date' - Interval 2 YEAR) AND ('$date' + Interval 2 YEAR)
       OR date ISNULL");

此栏中保存的日期格式为mm / dd / yyyy

一个。如何选择时间间隔?目前它正在选择所有行,而不仅仅是这个日期范围内的行。

湾我是否使用corret语法来确保包含所有空选项?

更新。

在答案和评论之后,我将列类型更改为“日期”(它是varchar),并且还将现有条目的当前类型更改为正确的日期格式。

我现在有两个问题: 一个。这仍然不起作用......还有什么可能是问题? 湾我想在PHP中更改保存条目的位置。我该怎么办呢?以下是正确的:

 $new_date = mysql_query("STR_TO_DATE($old_date_string,'%m/%d/%Y')");

解。

首先,我将列类型更改为DATE(来自VARCHAR)。

其次,我移动并将现有列中的所有现有条目和类型(str)转换为新类型(日期)和新列。

第三,我在“日期”部分添加了括号。

第四,我将ISNULL更改为IS NULL - 添加一个空格,将其从函数更改为语句。

第五,我现在正在更新我的脚本,以便将来日期保存到新类型的新列中,在将它们保存到数据库之前将它们转换为正确的fprmat。

谢谢@nnicholas和大家。

4 个答案:

答案 0 :(得分:6)

如果您确实将日期存储为字符串,我建议您使用以下内容更新表格

-- add a new column of type DATE
ALTER TABLE `table` ADD COLUMN `date_new` DATE AFTER `date`;
-- populate the new column from the old one
UPDATE `table` SET `date_new` = STR_TO_DATE(`date`,'%m/%d/%Y');
-- drop the old column
ALTER TABLE `table` DROP COLUMN `date`;
-- rename the new column
ALTER TABLE `table` CHANGE `date_new` `date` DATE;

完成这些更改后,处理日期对您来说会更容易。插入您收到的日期时,只需使用STR_TO_DATE('new_value','%m/%d/%Y')转换插入期间的日期 -

mysql_query("INSERT INTO `table` (field1, field2, `date`) 
               VALUES('value1', 'value2', STR_TO_DATE('$old_date_string','%m/%d/%Y')");

这假设$ old_date_string已经被清理过。

更新表结构后,标准日期算术函数将按预期工作。

$sql = mysql_query("SELECT *
                    FROM table
                    WHERE ...
                    AND (`date` BETWEEN ('$date' - INTERVAL 2 YEAR) AND ('$date' + INTERVAL 2 YEAR) OR `date` IS NULL)");

$date必须采用Y-m-d格式。

答案 1 :(得分:2)

如果它没有作为日期存储在数据库中,则无法对其进行日期比较。

您可以做一些非常难看的事情,将其转换为STR_TO_DATE()的日期,然后进行比较,但我建议您重新设计表格结构,将此日期存储为DATE对象。

SELECT * FROM table WHERE ... AND 
    STR_TO_DATE(date, '%m/%d/%Y') BETWEEN ('$date' - Interval 2 YEAR) AND ('$date' + Interval 2 YEAR)
    OR date ISNULL

这假设$date的格式为2012-03-14的正确MySQL DATE格式(2012年3月14日)

答案 2 :(得分:1)

您需要将整个日期检查部分括在括号中,如下所示:

$sql = mysql_query(" SELECT * FROM table WHERE ... AND 
       (
       date BETWEEN ('$date' - Interval 2 YEAR) AND ('$date' + Interval 2 YEAR)
       OR date ISNULL
       )");

它应该按预期工作。

除了缺少括号之外,你的条件好像都考虑了NULL(即无论传递的参数如何,NULL都会包含在输出中)。

<强>更新

似乎我错误地认为date列是date类型。 @James C has got the pointas well as @nnichols以及他们关于更改列类型的建议似乎是适合您情况的方法。

答案 3 :(得分:1)

你必须CAST / CONVERT你从MySQL获得的日期字段(你真的称为日期字段'日期'?这是个坏主意。)

最佳答案是将日期列转换为实际的DATE类型。您也不应该使用mm / dd / yyyy格式作为其模糊不清。