gpt4 book ai didi

sql - 检查两个日期是否包含给定月份

转载 作者:行者123 更新时间:2023-12-02 23:29:45 25 4
gpt4 key购买 nike

我的问题很简单......或者可能不是。我有一个包含两个日期的表:

StartDate
EndDate

我有一个常数,即一个月。例如:

DECLARE @MonthCode AS INT
SELECT @MonthCode = 11 /* NOVEMBER */

我需要一个单一查询来查找 StartDate 和 EndDate 包含给定月份的所有记录。例如:

/* Case 1 */ Aug/10/2009 - Jan/01/2010
/* Case 2 */ Aug/10/2009 - Nov/15/2009
/* Case 3 */ Nov/15/2009 - Jan/01/2010
/* Case 4 */ Nov/15/2009 - Nov/15/2009
/* Case 5 */ Oct/01/2010 - Dec/31/2010

第一个和最后一个情况需要特别注意:这两个日期都在 11 月之外,但跨越了 11 月。

以下查询不考虑情况 1 和 5:

WHERE MONTH( StartDate ) = @MonthCode OR MONTH( EndDate ) = @MonthCode

以下查询也失败,因为Aug < Nov AND Nov < Jan = false:

WHERE MONTH( StartDate ) = @MonthCode OR MONTH( EndDate ) = @MonthCode OR (
MONTH( StartDate ) < @MonthCode AND @MonthCode < MONTH( EndDate )
)

最佳答案

据我所知,您正在寻找一种方法来选择任何年份与 11 月相交的所有范围。

逻辑如下:

  • 如果范围属于单个年份(例如 2009 年),则开始月份必须早于或等于 11 月,结束月必须晚于或等于 11 月

  • 如果范围落在随后的两年(例如 2009-2010 年),则开始月份必须早于或等于 11 月,或者结束月晚于或等于 11 月

  • 如果范围落在相差超过 1 年的两年内(例如 2008-2010 年),则 11 月始终包含在范围内(此处为 2009 年 11 月)

翻译成伪代码,条件是:

// first case
(
(YEAR(StartDate)=YEAR(EndDate)) AND
(MONTH(StartDate)<=MonthCode AND MONTH(EndDate)>=MonthCode)
)
OR
// second case
(
(YEAR(EndDate)-YEAR(StartDate)=1) AND
(MONTH(StartDate)<=MonthCode OR MONTH(EndDate)>=MonthCode)
)
OR
// third case
(
YEAR(EndDate)-YEAR(StartDate)>1
)

关于sql - 检查两个日期是否包含给定月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1723015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com