【发布时间】:2019-05-11 02:14:19
【问题描述】:
我需要获取 MySQL 上几个日期中包含的天数。
例如:
- 入住日期为
12-04-2010 - 退房日期
15-04-2010
天差是 3。
【问题讨论】:
我需要获取 MySQL 上几个日期中包含的天数。
例如:
12-04-2010
15-04-2010
天差是 3。
【问题讨论】:
DATEDIFF 函数呢?
引用手册页:
DATEDIFF() 返回 expr1 – expr2 表示为从一开始的天数 约会对方。 expr1 和 expr2 是日期或日期和时间表达式。 只有值的日期部分是 用于计算
在你的情况下,你会使用:
mysql> select datediff('2010-04-15', '2010-04-12');
+--------------------------------------+
| datediff('2010-04-15', '2010-04-12') |
+--------------------------------------+
| 3 |
+--------------------------------------+
1 row in set (0,00 sec)
但请注意日期应写为YYYY-MM-DD,而不是像您发布的DD-MM-YYYY。
【讨论】:
datediff()方法的第一个参数必须大于第二个参数,否则返回负值。
【讨论】:
我更喜欢TIMESTAMPDIFF,因为如果需要,您可以轻松更改单位。
【讨论】:
请注意,如果您想计算两个日期之间的 FULL 24h 天,datediff 可能会为您返回错误的值。
如文档所述:
在计算中仅使用值的日期部分。
导致
select datediff('2016-04-14 11:59:00', '2016-04-13 12:00:00')
返回 1 而不是预期的 0。
解决方案是使用select timestampdiff(DAY, '2016-04-13 11:00:01', '2016-04-14 11:00:00');
(注意与 datediff 相比,参数的顺序相反)。
一些例子:
select timestampdiff(DAY, '2016-04-13 11:00:01', '2016-04-14 11:00:00');
返回 0
select timestampdiff(DAY, '2016-04-13 11:00:00', '2016-04-14 11:00:00');
返回 1
select timestampdiff(DAY, '2016-04-13 11:00:00', now()); 返回从 2016 年 4 月 13 日 11:00:00 到现在已经过去了多少完整的 24 小时。希望它对某人有所帮助,因为起初并不清楚为什么 datediff 返回的值似乎出乎意料或错误。
【讨论】:
datediff() 和timestampdiff() 之间翻转。
获取当前日期到目标日期之间的天数
SELECT DATEDIFF('2019-04-12', CURDATE()) AS days;
输出
335
【讨论】:
SELECT md.*, DATEDIFF(md.end_date, md.start_date) AS days FROM membership_dates md
输出::
id entity_id start_date end_date days
1 1236 2018-01-16 00:00:00 2018-08-31 00:00:00 227
2 2876 2015-06-26 00:00:00 2019-06-30 00:00:00 1465
3 3880 1990-06-05 00:00:00 2018-07-04 00:00:00 10256
4 3882 1993-07-05 00:00:00 2018-07-04 00:00:00 9130
【讨论】:
如果您想要一个比四舍五入的天数更准确的值:
select timestampdiff(minute, min(date_col), max(date_col))/1440 from table
【讨论】: