Select 从 table 开始的日期之间 - strtotime?

Select between dates from table - strtotime?

我试了一段时间,看了无数的Whosebug答案还是破解不了!

我的数据库中有一个 table,其中有一个名为 dob 的字段。该字段目前只是一个 TEXT 字段(但我已经尝试将其更改为 DATE 字段,但仍然无法正常工作)。

DOB 字段的数据采用这种格式(英国日期)- 22/05/2016。

我正在尝试找出生日在两个日期之间的用户数。

例如最近两年出生的人:

$twoyearsago=date('d/m/Y', strtotime("-2 years"));
$today = date("d/m/Y");

$sql = mysql_query("SELECT * FROM users WHERE dob >= '" . $twoyearsago . "' AND date <= '" . $today . "' ORDER by id DESC");

我也试过:

  $sql = mysql_query("SELECT * FROM users WHERE dob BETWEEN '" . date('d-m-Y', strtotime($twoyearsago)) . "' AND '" . date('d-m-Y', strtotime($today)) . "'";

希望您能看到我的逻辑在哪里,并希望您能看到我哪里出了问题 - 任何帮助将不胜感激。

杰克

有了STR_TO_DATE可以转换日期吗

注意:我已将列类型从 TIMESTAMP 更改为 DATE,因为在 TIMESTAMP 中您可以存储 1970-01-01 之前的日期。

SELECT STR_TO_DATE('22/05/2016','%d/%m/%Y');

样本

MariaDB [bb]> SELECT STR_TO_DATE('22/05/2016','%d/%m/%Y');
+--------------------------------------+
| STR_TO_DATE('22/05/2016','%d/%m/%Y') |
+--------------------------------------+
| 2016-05-22                           |
+--------------------------------------+
1 row in set (0.00 sec)

MariaDB [bb]>

所以你可以改变你Table

ALTER TABLE `users`
ADD COLUMN new_dob DATE;

UPDATE `users` SET new_dob = str_to_date(dob,'%d/%m/%Y');

** Verify the dates

ALTER TABLE `users`
DROP COLUMN dob;

ALTER TABLE `users`
CHANGE COLUMN `new_dob` `dob` DATE;

** CREATE an INDEX for perfomance **

ALTER TABLE `users`
ADD KEY (`dob`);

SELECT

SELECT * from `users` where dob between '2014-01-01' AND `2015-08-01';

您需要使用实际日期值而不是字符串来构建查询。所以你需要在查询中使用格式 YYYY-MM-DD - 比较的双方。

试试看。

$twoyearsago=date('Y-m-d', strtotime("-2 years")); 
$today = date("Y-m-d");

$sql = mysql_query("SELECT * FROM users WHERE STR_TO_DATE(dob, '%d/%m/%Y') >= '" . $twoyearsago . "' AND STR_TO_DATE(dob, '%d/%m/%Y') <= '" . $today . "' ORDER by id DESC");

STR_TO_DATE(dob, '%d/%m/%Y') 确保您的 d/m/Y 保存的 dob 字符串值在 MySQL 的查询中转换为日期可以理解并与给定的 YYYY-MM-DD 值进行比较。 实际上,正确的方法是创建一个日期字段并使用相同的函数将 dob 字符串值作为日期传输到这个新字段,除非您总是将日期值作为字符串输入到 dob 字段中。

许多本地日期格式的问题在于它们的词汇顺序和时间顺序不同(例如,16-11-2016 在词汇上排在 11-12-2016 之后,但在时间顺序上排在前面)。这就是为什么在大多数情况下以某种区域格式将日期存储在字符串字段中不是一个好主意:您迟早会遇到排序问题。

接下来,在为 MySQL 按字面指定日期时,您必须遵守某些格式,如 the documentation

中所述

将其付诸实践,范围变量应如下所示:

$today = date("Y-m-d");
$twoyearsago=date("Y-m-d", strtotime("-2 years"));

然后我们使用内置函数str_to_date将字符串列转换为可以正确比较的日期:

SELECT * FROM users WHERE
STR_TO_DATE(dob, '%d/%m/%Y') between '$twoyearsago' and '$today'

这会起作用,但在长 运行 中,您最好将该 dob 列转换为真实日期格式(如@BerndBuffen 所示),因为它更清晰、更容易国际化并且更好表演。

旁注:您仍在使用长期弃用的 mysql_ 扩展。您真的应该切换到 mysqli_ 或 PDO。

另一种方法是使用 DateTime 并在查询之前格式化日期。

$begin = '10/02/2014';
$emd = '10/02/2015';

$beginDate = DateTime::createFromFormat('d/m/Y', $begin);
$emdDate = DateTime::createFromFormat('d/m/Y', $emd);

$stmt = "
SELECT
...
FROM users
WHERE birthday >= '".$beginDate->format('Y-m-d')."'
AND birthday <= '".$endDate->format('Y-m-d')."'
";