2012-01-10 20 views
3

であればいずれかが....どのように今日の自分の誕生日を持っている従業員のリストを取得するSQLクエリ今日は従業員の誕生日

おかげで、 ヴィシャル

+7

「はい」...直接 – SQLMason

+0

@DanAndrewsをあなたの質問に答えるために、これを行うためではない、無条件:) –

答えて

16
SELECT * 
FROM Employees 
WHERE DATEPART(d, DateOfBirth) = DATEPART(d, GETDATE()) 
    AND DATEPART(m, DateOfBirth) = DATEPART(m, GETDATE()) 
+3

一つのコメントは、これは 'DateOfBirth'がその同じ時間帯に格納されていることを前提としていることですSQLサーバーで設定します。 'DateOfBirth'をUTCに格納すると、' GETUTCDATE() 'が必要になります。 – rrrr

+0

@Demsサンプルデータベースの実行計画をチェックし、少なくともインデックスを使用していると主張しています。 –

+0

@miikaL。 - 最高でスキャンを使用します。それはまだフルスキャンであり、シークではありません。 – MatBailie

0

WHEREを教えてもらえますチェックします従業員の誕生日の月と日が今日の月と日(明らかに)一致します。より具体的な指示には、より多くの入力が必要です。

0

あなたはこのような何か行うことができます。

select e.name from employeeTable e 
where right(e.birthday) = right(convert(varchar(8), getdate(), 112), 4) 

または

select e.name from employeeTable e 
where datepart(d, e.birthday) = datepart(d, getdate()) 
    and datepart(m, e.birthday) = datepart(m, getdate()) 
+1

afaikこれはまた、 'birthday'フィールドで難読化してインデックスを作成します。 – MatBailie

+0

@Dems私はそれを忘れています:) –

1

理想的には、データソースの構造について、もう少し情報が役立つだろうが、あなたの従業員レコードを提供する単純な答え持っているがDOBこのフィールドの曜日と月を、クエリのwhere句の現在のシステム日付と比較することです。次の行に沿って

何か:

select * from wherever 
where 
.... 
(
    datepart(d, EmployeeDOB) = datepart(d, getdate()) and 
    datepart(m, EmployeeDOB) = datepart(m, getdate()) 
) 
..... 
+0

Hey andy、thnxたくさん.... : –

+1

@VishalAvhad - このオプションはINDEXを難読化し、全テーブルスキャンを強制します。レコード数が多い場合、これは大きなオーバーヘッドになります。 – MatBailie

0

これは、はるかに長いったらしいですが、それはマッチを探して、テーブル全体をスキャンする必要がなくなりありません。

WITH 
    a_century AS 
(
    SELECT 1 AS year 
    UNION ALL 
    SELECT year * 2 + 0 AS year FROM a_century WHERE year < 64 
    UNION ALL 
    SELECT year * 2 + 1 AS year FROM a_century WHERE year < 64 
) 
SELECT 
    * 
FROM 
    yourTable 
INNER JOIN 
    a_century 
    ON yourTable.birthday = DATEADD(year, -a_century.year, DATEADD(day, DATEDIFF(day, 0, getDate()), 0)) 
関連する問題