[英]How to select data previous and next from data range in SQL Server?
我想从范围月份中选择数据。 示例: @month = 4
然后是从15-03
到15-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.