MYSQL 日期计算函数:DATE_ADD 与简单 + INTERVAL - 有什么区别?

I-J*_*I-J 4 mysql date

如果这是一个重复的问题,但我无法在这里或其他任何地方找到任何答案,请原谅我。

我已经习惯了使用功能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功能可以提高可读性和简单性,但我可能错了!

Str*_*rry 6

如您所见,两种变体都以相同的方式执行...

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,我同意你的看法。