2008-09-22 148 views
1

如何在SQL中檢索給定月份的所有客戶的生日?那麼MySQL呢? 我正在考慮在SQL Server中使用以下內容。每月生日SQL查詢

select c.name 
from cust c 
where datename(m,c.birthdate) = datename(m,@suppliedDate) 
order by c.name 
+0

爲什麼不爲MySQL的工作?當然他們有一個datepart()等效? – 2008-09-22 02:36:04

+0

EXTRACT似乎做了我認爲datepart()所做的事情。例如:SELECT EXTRACT(day FROM`myDate`)。每個部分都有單獨的函數,但是(day(),month(),year()等) – nickf 2008-09-22 02:39:32

回答

5

不要忘記了2月29日...

SELECT c.name 
FROM cust c 
WHERE (
    MONTH(c.birthdate) = MONTH(@suppliedDate) 
    AND DAY(c.birthdate) = DAY(@suppliedDate) 
) OR (
    MONTH(c.birthdate) = 2 AND DAY(c.birthdate) = 29 
    AND MONTH(@suppliedDate) = 3 AND DAY(@suppliedDate) = 1 
    AND (YEAR(@suppliedDate) % 4 = 0) AND ((YEAR(@suppliedDate) % 100 != 0) OR (YEAR(@suppliedDate) % 400 = 0)) 
) 
2

個人而言,我會用DATEPART而不是DATENAME作爲DATENAME是開放的根據地區不同的解釋。

1

其實我被誘惑加入birthmonth列,如果你希望客戶名單變得非常大。到目前爲止,我所看到的查詢(包括示例)將需要全表掃描,因爲您正在將數據列傳遞給函數並進行比較。如果表格大小不一,這可能需要相當長的時間,因爲沒有索引能夠提供幫助。

所以,我想補充的birthmonth列(索引),只是做(有可能MySQLisms):

SELECT name 
FROM cust 
WHERE birthmonth = MONTH(NOW()) 
ORDER BY name; 

當然,它應該很容易設置birthmonth列或者與觸發或你的客戶代碼。

2

如果你在一個給定的個月要求所有的生日,那麼你應該提供個月,不是日期

SELECT c.name 
FROM cust c 
WHERE datepart(m,c.birthdate) = @SuppliedMonth