我已经尝试了一段时间,阅读了无数的stackoverflow答案,仍然无法破解它!
我的数据库中有一个名为dob的表。这个字段目前只是一个TEXT字段(但我已经尝试将其更改为DATE字段,仍然无法使其工作)。
DOB字段的数据采用此格式(英国日期) - 2016年5月22日。
我试图找出两个日期之间生日的用户数量。
例如,过去两年出生的任何人:
$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)) . "'";
希望你能看到我的逻辑在哪里,并希望你会看到我的错误 - 任何帮助将不胜感激。
杰克
答案 0 :(得分:2)
使用 STR_TO_DATE 可以转换日期
注意:我已将列类型从TIMESTAMP更改为DATE,因为在TIMESTAMP中您可以在1970-01-01之前存储日期。
选择STR_TO_DATE(&#39; 22/05 / 2016&#39;%d /%m /%Y&#39;);
<强>样品强>
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]>
所以你可以改变你的表
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 * from `users` where dob between '2014-01-01' AND `2015-08-01';
答案 1 :(得分:1)
许多本地日期格式的问题在于它们的词汇和时间顺序是不同的(例如,16-11-2016在2016年12月11日之后出现,但在时间顺序之前)。这就是为什么在某些区域格式的字符串字段中存储日期在大多数情况下是个坏主意:迟早会得到排序问题。
接下来,在为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。
答案 2 :(得分:0)
您需要使用实际日期值而不是字符串来构建查询。因此,您需要在查询中格式化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,&#39;%d /%m /%Y&#39;)确保您的d / m / Y保存dob字符串值,以便在MySQL可以理解并与之比较的查询中转换为日期给定的YYYY-MM-DD值。 实际上,正确的方法是使用相同的函数创建一个日期字段并将dob字符串值作为日期传送到此新字段,除非您始终将日期值作为字符串输入到dob字段中。
答案 3 :(得分:0)
另一种方法是使用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')."'
";