Mysql日期间隔

Luc*_*ord 2 mysql database null datetime date

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

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

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

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

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

更新.

在答案和注释之后,我将列类型更改为"Date"(它是varchar),并且还将现有条目的当前类型更改为正确的日期格式.

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

 $new_date = mysql_query("STR_TO_DATE($old_date_string,'%m/%d/%Y')");
Run Code Online (Sandbox Code Playgroud)

解.

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

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

第三,我在"日期"部分添加了括号.

第四,我换ISNULLIS NULL-插件的空间,从而改变它的功能给一个说法.

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

谢谢@nnicholas和大家.

nni*_*ols 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;
Run Code Online (Sandbox Code Playgroud)

完成这些更改后,处理日期对您来说将更加容易.插入您收到的日期时,您只需使用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')");
Run Code Online (Sandbox Code Playgroud)

这假设$ 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)");
Run Code Online (Sandbox Code Playgroud)

$date 必须采用Ymd格式.