2016-07-19 21 views
1

誕生日が近づいているすべての従業員を取得しようとしています。毎回その年が考慮されているため、 。誕生日の30日以内にSQLを取得する(年を問わず)

ので、私は今だクエリが

SELECT [emp].[FirstName] 
     ,[emp].[LastName] 
     ,[emp].[Birthday] 
FROM [Employees] AS [emp] 
WHERE [emp].[ID] != 12 
    AND [emp].[Birthday] >= GETDATE() 
    AND [emp].[Birthday] <= DATEADD(dd,20,GETDATE()) 

ある問題には、従業員の誕生日は、2016年に私はこの

+0

使用しているSQL Serverのバージョンはどれですか? – DavidG

答えて

1
SELECT [emp].[FirstName] 
     ,[emp].[LastName] 
     ,[emp].[Birthday] 
FROM [Employees] AS [emp] 
WHERE [emp].[ID] != 12 
    AND MONTH([emp].[Birthday]) IN (MONTH(GETDATE()),MONTH(DATEADD(MONTH,1,GETDATE()))) 
    AND DAY([emp].[Birthday]) >= DAY(GETDATE()) 

UPDATE

を確認することができますどのように任意のアイデアではないですこれがこの複雑になる可能性はありませんでした。現在の日付が数字の誕生日よりも大きい場合、上記のクエリは機能しません(例:現在のdaテが29、誕生日が来月3日になる)

これまでのところ、私は更新されたバージョンを試してみましたが、これまではうまくいきました。

SELECT [emp].[FirstName] 
      ,[emp].[LastName] 
      ,[emp].[Birthday] 
    FROM [Employees] AS [emp] 
    WHERE [emp].[ID] != 12 
AND ((MONTH([emp].[Birthday]) = MONTH(GETDATE()) AND DAY([emp].[Birthday]) > DAY(GETDATE())) 
    OR (MONTH([emp].[Birthday]) = MONTH(DATEADD(MONTH,1,GETDATE())) AND DAY([emp].[Birthday]) < DAY(DATEADD(MONTH,1,GETDATE())))) 

だから、ロジックは次のとおりです。

If誕生日の月、現在の月のようにsameあり、そして日付が誕生日の月がcurrent+1月であれば、その日はあるべき、現在の日付よりもgreater

ELSE

する必要がありますlesserより翌月の日付。

+0

これはうまくいくようです。 – 173901

1

は、SQL Server 2012以降を使用している場合、あなたは現在の年にあなたの誕生日の日付を強制するDATEFROMPARTS機能を使用することができます。

SELECT [emp].[FirstName] 
     ,[emp].[LastName] 
     ,[emp].[Birthday] 
FROM [Employees] AS [emp] 
WHERE [emp].[ID] != 12 
AND CASE 
    WHEN DATEPART(MONTH, Birthday) = 2 AND DATEPART(DAY, Birthday) = 29 
     THEN DATEFROMPARTS(DATEPART(YEAR, GETDATE()), 3, 1) 
    ELSE 
     DATEFROMPARTS(DATEPART(YEAR, GETDATE())+1, DATEPART(MONTH, Birthday), DATEPART(DAY, Birthday)) END 
BETWEEN GETDATE() AND DATEADD(DAY, 30, GETDATE()) 
+1

現在の日付が年末で、従業員の誕生日が始まっている場合、これは機能しますか? –

+0

私はそのオプションを持っていません。私はより低いバージョンを使用している必要があります – 173901

0

これはおそらくきれいかもしれないが、それはハングを取得することはできません

SELECT [emp].[FirstName] 
     ,[emp].[LastName] 
     ,[emp].[Birthday] 
FROM [Employees] AS [emp] 
WHERE [emp].[ID] != 12 
AND DATEDIFF(dd, GETDATE(), DATEADD(yy, CASE WHEN DATEADD(yy, DATEDIFF(yy, [emp].Birthday, GETDATE()), [emp].Birthday) < DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0) THEN 1 ELSE 0 END + DATEDIFF(yy, [emp].Birthday, GETDATE()), [emp].Birthday)) BETWEEN 0 AND 20 
1

はるかに簡単かつきれい:

今日は今年の終わり近くで、来年の初めに誕生日があるときまで
関連する問題