1

我有一个 MySQL 表,其中包含(除其他外)以下列:

[名称] [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]

我希望我对此足够清楚,我希望有人能给我一个答案。

4

2 回答 2

2

要获取日期之间的差异(以天为单位),请使用 DATEDIFF()。要根据条件取一个值或另一个值,请使用 IF,但在这种情况下,我使用的是类似的 IFNULL()。

SELECT DATEDIFF(IFNULL(member_until_date, NOW()), member_since_date) AS days_member
FROM ...

IFNULL() 表示使用第一个参数,除非它为空,否则使用第二个参数。

DATEDIFF() 首先需要较大的日期才能获得肯定的结果。

COALESCE() 提供与 IFNULL() 类似的功能,并且是 ANSI SQL 的执行方式。

于 2012-04-29T14:11:35.137 回答
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
于 2012-04-29T14:12:04.793 回答