如何检查月/日日期范围

时间:2014-04-25 19:51:35

标签: sql date sql-server-2008-r2

DECLARE @SEASONSTARTDATE date = '1900-03-26'
DECLARE @SEASONENDDATE date = '1900-12-31'

使用Above数据,如何检查它是否在当前的MONTH和DAY范围内。

例如今天的日期是2014-04-25(年份无关紧要),这意味着上述数据自3/26和12/31以来有效。

编辑:

declare @SOMEDATA TABLE(
    SEASON_START_DATE datetime,
    SEASON_END_DATE datetime
)

INSERT INTO @SOMEDATA
VALUES ('1900-03-26','1900-12-31')

SELECT * FROM @SOMEDATA
WHERE DATEPART(MONTH,GETDATE()) BETWEEN DATEPART(MONTH,SEASON_START_DATE) AND DATEPART(MONTH,SEASON_END_DATE)
AND DATEPART(DAY,GETDATE()) BETWEEN DATEPART(DAY,SEASON_START_DATE) AND DATEPART(DAY,SEASON_END_DATE)

上面应该给我一个结果,因为当前日期的有效范围是3/26和12/31。

以上内容无效是因为我先将日期分为月份,并将月份与范围进行比较,然后对日期进行了相同的处理,如何进行,以便将月份与日期进行比较当前月/日查看当前月/日是否在范围内?

1 个答案:

答案 0 :(得分:1)

DATEPART返回整数。 使用> =和< =代替BETWEEN。 看看这是否有帮助。

此外,似乎你有一个合乎逻辑的问题 对于结束日期,您只检查DAY,
对于开始日期,您只检查MONTH。

这对我来说似乎不对。

试试这个:

DECLARE @DT datetime

SET @DT = getdate()
DECLARE @m1 int
SET @m1 = DATEPART(MONTH, SEASON_START_DATE)
DECLARE @m2 int
SET @m2 = DATEPART(MONTH, SEASON_END_DATE)
IF (@m2 < @m1) 
   BEGIN
        SET @m2 = @m2 + 12

        DECLARE @m int
        SET @m = DATEPART(MONTH, @DT)
        IF (@m >= 1 and @m <= @m2) BEGIN SET @m = @m + 12 END
   END


SELECT * FROM @SOMEDATA
WHERE 
@m * 100 + DATEPART(DAY,@dt) >= 
    @m1 * 100 + DATEPART(DAY,SEASON_START_DATE)
AND
@m * 100 + DATEPART(DAY,@dt) <=  
    @m2 * 100 + DATEPART(DAY,SEASON_END_DATE)