mysql 在排除的日期之间搜索

fsi0uk1n  于 2023-11-16  发布在  Mysql
关注(0)|答案(1)|浏览(110)

我已经完成了第一部分:我有一个名为Clients的表,其中有一个名为Last_Seen的列。我需要返回6个月并向前一周(搜索180到173天),并获取在这7天窗口期间看到的记录。
我需要帮助第二部分:
我不希望同一个客户端出现在这个7天的窗口搜索,如果他们是'Last_Seen'或有一个预定的约会列称为'预定'后,7天的窗口。任何想法如何实现这一点?谢谢!!
我用这个查询完成了第1部分:

SELECT DISTINCT *
FROM Clients
WHERE Last_Seen BETWEEN CURDATE() - INTERVAL 180 DAY
                    AND CURDATE() - INTERVAL 173 DAY
AND Last_Seen IS NOT NULL

字符串
回答我自己的问题与以下:

SELECT DISTINCT *
FROM Clients
WHERE Last_Seen BETWEEN CURDATE() - INTERVAL 180 DAY
                    AND CURDATE() - INTERVAL 173 DAY
AND Last_Seen IS NOT NULL
AND Last_Seen NOT BETWEEN CURDATE() - INTERVAL 173 DAY
                      AND CURDATE() - INTERVAL 1 DAY
AND Scheduled NOT BETWEEN CURDATE() - INTERVAL 173 DAY
                      AND CURDATE() - INTERVAL 1 DAY
AND Last_Seen NOT BETWEEN CURDATE() - INTERVAL 172 DAY
                      AND CURDATE() - INTERVAL 1 DAY
AND Scheduled NOT BETWEEN NOW()
                      AND (NOW() + INTERVAL 365 DAY)

tp5buhyn

tp5buhyn1#

简短的回答

假设Clients表看起来像这样,当前日期为2023-10-26
| ID|名称|最后一次看到|定于|
| --|--|--|--|
| 1 |客户端1| 2023-09-01 11:00| NULL|
| 2 |客户端2| 2023-04-27 10:00| NULL|
| 3 |客户机3| 2023-05-02 09:00:00| 2023-10-27 14:00|
我们对Client 1不感兴趣,因为Last_Seen不符合 “Part 1” 标准。Client 2Client 3都符合 “Part 1” 标准,但只有Client 2符合 “Part 2” 标准。
实现此结果的查询很简单:

SELECT *
FROM Clients
WHERE Last_Seen >= CURDATE() - INTERVAL 6 MONTH
  AND Last_Seen <  CURDATE() - INTERVAL 6 MONTH + INTERVAL 1 WEEK
AND (
    Scheduled IS NULL OR
    Scheduled < CURDATE() - INTERVAL 6 MONTH + INTERVAL 1 WEEK
);

字符串
这看起来仍然有点奇怪,如果一个客户在六个月前是Last_Seen,但在几周/几个月后有一个Scheduled预约,那么Last_Seen日期肯定应该是Scheduled预约的日期,除非他们错过了预定的预约,在这种情况下,我们想安排另一个?

说明

你试图回答自己的问题似乎有点“不可靠”。
让我们从 “第1部分” 的解决方案中的问题开始:

SELECT DISTINCT *
FROM Clients
WHERE Last_Seen BETWEEN CURDATE() - INTERVAL 180 DAY
                    AND CURDATE() - INTERVAL 173 DAY
 AND Last_Seen IS NOT NULL;


首先,AND Last_Seen IS NOT NULL是冗余的,因为它不可能在为空时满足第一个标准(日期范围)。
第二,正如培训及房屋局局长在评论中指出:
180天不是6个月,180到173也不是7天的窗口期
您的日期范围条件计算为(如果Last_Seen是日期):

WHERE Last_Seen BETWEEN '2023-04-29'
                    AND '2023-05-06';


如果你的Last_Seen列包含日期(不是日期时间),它是8天(2023-04-29 - 2023-05-06包括在内)。如果你的Last_Seen列包含日期时间值,它并不那么糟糕,因为它的计算结果是:

WHERE Last_Seen BETWEEN '2023-04-29 00:00:00'
                    AND '2023-05-06 00:00:00';


这是7天零1秒,这可能不重要,但严格来说应该重写为:

WHERE Last_Seen >= CURDATE() - INTERVAL 6 MONTH
  AND Last_Seen <  CURDATE() - INTERVAL 6 MONTH + INTERVAL 1 WEEK;


其计算结果为(如果Last_Seen是datetime):

WHERE Last_Seen >= '2023-04-26 00:00:00'
  AND Last_Seen <  '2023-05-03 00:00:00';


现在来看看您的解决方案 “第2部分” 中的问题,从Last_Seen标准开始:

WHERE Last_Seen BETWEEN CURDATE() - INTERVAL 180 DAY
                    AND CURDATE() - INTERVAL 173 DAY
AND Last_Seen IS NOT NULL
AND Last_Seen NOT BETWEEN CURDATE() - INTERVAL 173 DAY
                      AND CURDATE() - INTERVAL 1 DAY
AND Last_Seen NOT BETWEEN CURDATE() - INTERVAL 172 DAY
                      AND CURDATE() - INTERVAL 1 DAY


下面是一组相同的条件,其中表达式被评估(假设Last_Seen是datetime):

WHERE Last_Seen BETWEEN '2023-04-29 00:00:00'
                    AND '2023-05-06 00:00:00'
AND Last_Seen IS NOT NULL
AND Last_Seen NOT BETWEEN '2023-05-06 00:00:00'
                      AND '2023-10-25 00:00:00'
AND Last_Seen NOT BETWEEN '2023-05-07 00:00:00'
                      AND '2023-10-25 00:00:00'


第3行是冗余的,如上所述。第4行和第5行是冗余的,因为不可能满足第1行和第2行,但不可能满足第4行和第5行(除了无意的1秒重叠之外)。第6行和第7行是冗余的,原因与第4行和第5行相同。
最后,关于Scheduled标准:

AND Scheduled NOT BETWEEN CURDATE() - INTERVAL 173 DAY
                      AND CURDATE() - INTERVAL 1 DAY
AND Scheduled NOT BETWEEN NOW()
                      AND (NOW() + INTERVAL 365 DAY)


评估为:

AND Scheduled NOT BETWEEN '2023-05-06 00:00:00'
                      AND '2023-10-25 00:00:00'
AND Scheduled NOT BETWEEN '2023-10-26 09:24:30'
                      AND '2024-10-25 09:24:30'


这些标准没有太大意义。在2023-10-25 00:00:002023-10-26 09:24:30之间有一个奇怪的洞。本质上,似乎你试图说Scheduled不在2023-05-06 00:00:00或之后。因为我们需要处理空值,这通常表示为:

AND (
    Scheduled IS NULL OR
    Scheduled < CURDATE() - INTERVAL 6 MONTH + INTERVAL 1 WEEK
)


假设有人参加了一个约会,导致Last_Seen被更新到Scheduled约会的日期时间,这可以重写为:

AND (
    Scheduled IS NULL OR
    Scheduled <= Last_Seen
)


或者可能:

AND (
    Scheduled IS NULL OR
    NOT Scheduled > NOW()
)


这里有一个db<>fiddle

相关问题