我有一个MySQL表(以及其他)以下列:
[name] [member_since_date] [member_until_date]
当某人的成员资格结束时,会填充[member_until_date]
字段,否则它包含NULL。
我需要一个基于SQL的纯解决方案:
我想计算某人成为会员的时间:填充[member_until_date]
时,我需要它来计算[member_until_date] - [member_since_date]
。
当某人仍然是会员时,字段[member_until_date]
为NULL
,因此我需要它来计算[NOW] - [member_since_date]
。
我希望我对此很清楚,我希望有人能给我一个答案。
答案 0 :(得分:2)
要获取日期之间的差异(以天为单位),请使用DATEDIFF()。要根据条件或其他条件获取一个值,请使用IF,但在这种情况下,我使用的是类似的IFNULL()。
SELECT DATEDIFF(IFNULL(member_until_date, NOW()), member_since_date) AS days_member
FROM ...
IFNULL()表示使用第一个参数,除非它为null,然后使用第二个参数。
DATEDIFF()首先需要更大的日期才能获得正面结果。
COALESCE()提供与IFNULL()类似的功能,并且是ANSI SQL的方法。
答案 1 :(得分:0)
以下是使用DATEDIFF()
的解决方案。
SELECT name, DATEDIFF(IF(member_until_date,member_until_date,NOW()),
member_since_date) AS membership_duration
FROM members;
首先,我们检查member_until_date
是否为空。如果是,我们使用NOW()
,否则我们使用member_until_date
。
IF(member_until_date,member_until_date,NOW())
现在我们计算会员的上述和开头之间的日期差异,member_since_date
,并且返回为membership_duration
。
DATEDIFF(IF(member_until_date,member_until_date,NOW()),
member_since_date) AS membership_duration