繁体   English   中英

如何从SQL Server的数据范围中选择上一个和下一个数据?

[英]How to select data previous and next from data range in SQL Server?

我想从范围月份中选择数据。 示例: @month = 4然后是从15-0315-05数据。 它看起来工作正常。

Wood    25-03-1990
Mary    10-04-1988
Brown   25-04-1989
White   10-05-1992

但是,当我尝试@month = 1@month = 12 ,找不到数据。 这是数据和代码片段

NAME    BIRTHDAY
John    10-11-1988
Green   25-11-1990
Black   25-12-1989
Blue    10-12-1991
Red     10-01-1992
Candy   25-01-1989
Food    10-02-1993
Apple   25-02-1988
Wood    25-03-1990
Meat    10-03-1991
Mary    10-04-1988
Brown   25-04-1989
White   10-05-1992
Yellow  25-05-1993

和 SQL-T

SELECT * FROM ABC
WHERE 
    CONVERT(DATE,CONVERT(VARCHAR(2),DATEPART(DAY,CONVERT(DATE,BIRTHDAY,105)))+'-'+
    CONVERT(VARCHAR(2), DATEPART(MONTH,CONVERT(DATE,BIRTHDAY,105)))+'-'+
    CONVERT(VARCHAR(4),YEAR(GETDATE())),105) 
BETWEEN 

    CONVERT(DATE,'15'+'-'+CONVERT(VARCHAR(2),
    --CASE 
    --     WHEN @month = 1 THEN '12' 
    --     WHEN @month = 12 THEN '11' 
    --     WHEN @month <> 1 AND @month <> 12 THEN @month-1
    --END 
    @month-1
    )+'-'+CONVERT(VARCHAR(4),YEAR(GETDATE())),105)
AND
    CONVERT(DATE,'15'+'-'+CONVERT(VARCHAR(2),
    --CASE 
    --     WHEN @month = 1 THEN '2' 
    --     WHEN @month = 12 THEN '1' 
    --     WHEN @month <> 1 AND @month <> 12 THEN @month+1
    --END
    @month+1
    )+'-'+CONVERT(VARCHAR(4),YEAR(GETDATE())),105)

将列作为日期时间会使事情变得更容易,但是如何:

declare @Month int
SELECT @Month =1
-- Get start of the period
declare @baseDate date
SELECT @baseDate = CONVERT(DATE,'15-'+CONVERT(char(2), @Month)+'-'+convert(varchar(4),YEAR(GETDATE())), 105)
Print @baseDate
declare @startDate date
SELECT @startDate = DATEADD(mm,-1, @baseDate)
PRINT @startDate
declare @endDate date
SELECT @endDate = DATEADD(mm,+1, @baseDate)
PRINT @endDate

SELECT *,DATEADD(yy, YEAR(GETDATE())-YEAR(CONVERT(datetime, birthday, 105)),CONVERT(date, birthday, 105)) FROM ABC
WHERE 
DATEADD(yy, YEAR(@StartDate)-YEAR(CONVERT(datetime, birthday, 105)),CONVERT(date, birthday, 105))
BETWEEN 
@StartDate AND @EndDate
OR
DATEADD(yy, YEAR(@EndDate)-YEAR(CONVERT(datetime, birthday, 105)),CONVERT(date, birthday, 105))
BETWEEN 
@StartDate AND @EndDate

** 根据 OP 的错误报告,在将生日调整为当前年份时进行了编辑以纠正错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM