我正在尋找3月21日至4月20日的出生日期範圍,並且年份並不重要。似乎當我搜索其他月份和日期出來。在SQL中尋找出生日期範圍
select * from AllStudentInfo Where
((MONTH(birthDate) >= 3 and day(birthDate) >= 21)
OR
(MONTH(birthDate) <= 4 and day(birthDate) <= 20))
AND
(BGRStatus = 'S' OR BGRStatus = 'SL')
我正在尋找3月21日至4月20日的出生日期範圍,並且年份並不重要。似乎當我搜索其他月份和日期出來。在SQL中尋找出生日期範圍
select * from AllStudentInfo Where
((MONTH(birthDate) >= 3 and day(birthDate) >= 21)
OR
(MONTH(birthDate) <= 4 and day(birthDate) <= 20))
AND
(BGRStatus = 'S' OR BGRStatus = 'SL')
有可能是你想發現&即將到來的日期。在任何情況下,你可以按如下方式創建一個虛擬日期:
SELECT DATEFROMPARTS (2017,month(birthDate),day(birthDate) as birthday
FROM AllStudentInfo
在這種情況下,你可以使用:
SELECT *
FROM AllStudentInfo
WHERE DATEFROMPARTS (2017,month(birthDate),day(birthDate)
BETWEEN '2017-03-21' AND '2017-04-20';
年2017
是任意的。問題是BETWEEN
條款中的日期是在同一年。
使用更現代的技術,您可以按如下結合起來:
WITH cte AS(
SELECT *,DATEFROMPARTS (2017,month(birthDate),day(birthDate) as birthDay
FROM AllStudentInfo
)
SELECT * FROM cte WHERE birthDay BETWEEN '2017-03-21' AND '2017-04-20';
的cte
是公共表表達式這是使用子查詢的替代品。
這是一個更接近問題精神的選擇。您可以使用format
函數生成這純粹月&日的表達式:
format(birthDate,'MM-dd')
的MM
是說的2位數月份數的MSSQL的方式,而dd
是這個月的2位數的日期。
這樣,您就可以使用:
format(birthDate,'MM-dd') BETWEEN '03-21' AND '04-20'
再次爲CTE:
WITH cte AS(
SELECT *,format(birthDate,'MM-dd') as birthDay
FROM AllStudentInfo
)
SELECT * FROM cte WHERE birthDay BETWEEN '03-21' AND '04-20';
你應該得到相同的結果,但今年完全被忽略。
您的發言切換到AND
像這樣
select * from AllStudentInfo Where
((MONTH(birthDate) >= 3 and day(birthDate) >= 21)
AND --Make the change here
(MONTH(birthDate) <= 4 and day(birthDate) <= 20))
AND
(BGRStatus = 'S' OR BGRStatus = 'SL')
使用OR
您要查詢什麼,在該日期範圍或者當月範圍。因此,你每個月都會得到其他結果。
如果我更改爲AND沒有顯示數據。 雖然,我知道有學生生日在03/26 – GiveChance
我有一個數據包含1999-03-26,而BGRStatus是S但我的數據不顯示,如果我使用的變化。我嘗試了AND,但沒有數據。 – GiveChance
我正在尋找3月21日至4月20日發生的每個人的生日。所以我不能讓我的年份輸入。就好像我做了輸入,其他月份的數據會出現,只要他們有一個BGR的條件='S'或BGR ='SL' – GiveChance
@GiveChance就是這一點。這個表達式爲當年創造了一個新的日期。 – Manngo
只是做同樣的方法DATEFROMPARTS(年(getdate()),03,21)和DATEFROMPARTS(年(getdate()),04,20) – luly