2017-05-07 47 views
0

我正在尋找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') 

回答

1

有可能是你想發現&即將到來的日期。在任何情況下,你可以按如下方式創建一個虛擬日期:

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'; 

你應該得到相同的結果,但今年完全被忽略。

+0

我正在尋找3月21日至4月20日發生的每個人的生日。所以我不能讓我的年份輸入。就好像我做了輸入,其他月份的數據會出現,只要他們有一個BGR的條件='S'或BGR ='SL' – GiveChance

+0

@GiveChance就是這一點。這個表達式爲當年創造了一個新的日期。 – Manngo

+0

只是做同樣的方法DATEFROMPARTS(年(getdate()),03,21)和DATEFROMPARTS(年(getdate()),04,20) – luly

0

您的發言切換到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您要查詢什麼,在該日期範圍或者當月範圍。因此,你每個月都會得到其他結果。

+0

如果我更改爲AND沒有顯示數據。 雖然,我知道有學生生日在03/26 – GiveChance

+0

我有一個數據包含1999-03-26,而BGRStatus是S但我的數據不顯示,如果我使用的變化。我嘗試了AND,但沒有數據。 – GiveChance