如果这是一个重复的问题,但我无法在这里或其他任何地方找到任何答案,请原谅我。
我已经习惯了使用功能MYSQL的计算日期DATE_ADD,DATE_SUB等详见这里:https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html。
但是我在另一个答案中看到,可以简单地使用诸如CURDATE() + INTERVAL 1 DAY.
以下测试产生了两行相同的结果。
SELECT
CURDATE() AS Today,
CURDATE() + INTERVAL 5 DAY AS 5_Days,
CURDATE() - INTERVAL 3 MONTH AS 3_Months_Ago,
CURDATE() + INTERVAL 1 YEAR AS 1_Year
UNION ALL SELECT
CURDATE() AS Today,
DATE_ADD(CURDATE(), INTERVAL 5 DAY) AS 5_Days,
DATE_SUB(CURDATE(), INTERVAL 3 MONTH) AS 3_Months_Ago,
DATE_ADD(CURDATE(), INTERVAL 1 YEAR) AS 1_Year
Run Code Online (Sandbox Code Playgroud)
我的问题是:这两种方法有什么区别吗?要么比另一个好?IMO,不使用这些DATE_ADD功能可以提高可读性和简单性,但我可能错了!
如您所见,两种变体都以相同的方式执行...
EXPLAIN EXTENDED
SELECT * FROM weddings WHERE CURDATE()-INTERVAL 40 YEAR > dob;
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | weddings | ALL | dob | NULL | NULL | NULL | 10 | Using where |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
SHOW WARNINGS;
select test.weddings.id AS id
, test.weddings.name AS name
, test.weddings.gender AS gender
, test.weddings.dob AS dob
, test.weddings.birthplace AS birthplace
, test.weddings.wedding_date AS wedding_date
from test.weddings
where ((curdate() - interval 40 year) > test.weddings.dob)
EXPLAIN EXTENDED
SELECT * FROM weddings WHERE DATE_SUB(CURDATE(),INTERVAL 40 YEAR) > dob;
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | weddings | ALL | dob | NULL | NULL | NULL | 10 | Using where |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
SHOW WARNINGS;
select test.weddings.id AS id
, test.weddings.name AS name
, test.weddings.gender AS gender
, test.weddings.dob AS dob
, test.weddings.birthplace AS birthplace
, test.weddings.wedding_date AS wedding_date
from test.weddings
where ((curdate() - interval 40 year) > test.weddings.dob)
Run Code Online (Sandbox Code Playgroud)
FWIW,我同意你的看法。
| 归档时间: |
|
| 查看次数: |
383 次 |
| 最近记录: |