在MySQL请求中减去另一个日期?

时间:2011-07-29 09:55:34

标签: php mysql

我有start_dateend_date的表格。我需要找到持续时间(end_date-start_date)。有人可以建议我如何在查询中这样做吗?我是否会在查询中以duration=end_date-start_date为例获得一个新变量?

EDIT 如果我使用mminus,它会给我:

  

2012-07-01减去2012-01-01 = 600

2011-07-27 - 2011-07-06 = 21,如何在6个月内600天?所以我认为这是几天? 即使日期是在月中,是否有功能实际获得多少个月。 例如比如“3月6日”和“7月27日”是2个月

4 个答案:

答案 0 :(得分:3)

使用PERIOD_DIFF

返回期间P1和P2之间的月数。 P1和P2的格式应为YYMM或YYYYMM。请注意,句点参数P1和P2不是日期值。所以试试

SELECT PERIOD_DIFF(
                   DATE_FORMAT('2011-07-27','%Y%m'),
                   DATE_FORMAT('2011-06-03','%Y%m')
                  ) AS durationInMonths

答案 1 :(得分:1)

如果您想知道DateTime不同,可以使用TimeDiff

select 
 (Hour(Duration) / 24)/365 as Year, 
 (Hour(Duration) / 24)%365 as Day, 
 (Hour(Duration) % 24) as Hours, 
 MINUTE(Duration) as Minutes, 
 SECOND(Duration) as Seconds
 from
(
SELECT ADDTIME(NOW(),'1000:27:50') as end_datetime, NOW() as start_datetime,
TIMEDIFF(ADDTIME(NOW(),'1000:27:50'), NOW()) AS Duration
) x;

如果您想知道日期不同,可以使用DateDiff()

select DATEDIFF('2011-06-06','2011-05-01');

答案 2 :(得分:1)

您可以使用*但是为了获得持续时间,您需要在其后添加额外的列

select *, DATEDIFF(updated_at, created_at) from users;

要获得最佳实践,最好为用户命名,为额外列命名。 所以你可以在顶部看到持续时间标题。将sql过程导出为ex​​cel是很好的。

select u.*, DATEDIFF(updated_at, created_at) as duration from users u;

同样从您的php或rails代码中,您可以调用给定的变量名称。在rails中,

users =User.find_by_sql("select u.*, DATEDIFF(updated_at, created_at) as duration from users u")

users.first.duration

答案 3 :(得分:0)

SELECT end_date - start_date AS duration FROM table ...