2016-04-16 14 views
2

私は誕生日のSQL Serverに来ている10人のリストを印刷したいが、私は適切な解決策を見つけられていない。私はこれを試みたが、それは正しく動作しません。私を助けてください。SQL ServerまたはLinqでリストの誕生日を取得するには?

のSQL Server

SELECT TOP 5 NAME, 
      birthday, 
      Datediff(dd, people.birthday, Getdate())/365.00/( 
      Year(Getdate()) - Year(people.birthday)) AS DAYS 
FROM people 
WHERE Datediff(dd, people.birthday, Getdate())/365.00/( 
       Year(Getdate()) - Year(people.birthday)) <= 1 
ORDER BY days DESC 

LINQ

var query = 
    (from c in db.PEOPLEs 
    where ((DbFunctions.DiffDays(c.BIRTHDAY, DateTime.Now)/365.25/(DateTime.Now.Year - c.NGAYSINH.Year))<=1) 
    orderby (DbFunctions.DiffDays(c.BIRTHDAY, DateTime.Now)/365.00/(DateTime.Now.Year - c.BIRTHDAY.Year)) ascending 
    select c).Take(5); 
+1

コードを読みやすくするために少し努力します。また、*よりもいくつかの詳細を与えると正しく動作しません。 –

+0

10人が必要ですが、2つのクエリで5人が返されます(上位5人とTake(5人))。私はあなたの正確な意志を知らないので(5人または10人...) –

+0

私はあなたの質問を理解していません。どういう意味ですか?同じ日に誕生日のある人ですか?同じ週、同じ年に誕生日を持つすべての人、erc?それを解決しようとしているときに見つけた問題は何ですか?より具体的にしてください。もちろん、コードをリバースエンジニアリングすることもできますが、実行したいことを記述することは簡単です。 – Matt

答えて

0

クエリが書き換えられている来年の日付を検討するUPD

Select Top 5 Name, BIRTHDAY 
From People 
Order by ABS(DATEDIFF("d", BIRTHDAY, GETUTCDATE())) DESC 

このアプローチでは、うるう年と02/29に生まれた人を適切に処理します。

+1

今日が今年の終わりに近づいたらどうなりますか? –

+0

翌年に検討するようにクエリを変更しました –

+0

あなたのクエリは、現在の日付と月日の組み合わせではなく、誕生日 - ノートの日数の差を測定しますが、完全な日付、すなわち曜日、生まれた*。だから、人々は、彼らの次の誕生日がどれほど近いかではなく、年齢によって分類されます。 –

0

これは、今年のアカウントの終了になりますなど

select top 10 * 
from People 
order by (datepart(dy,Birthday)-datepart(dy,getdate())+365) % 365 

それは、現在の日付のdayofyearに対する(1〜365から)それぞれの誕生日のためにdayofyearを計算することによって動作、およびモジュロ除算を使用しています(% )を使用して答えを0-365の範囲に持ってきて、正しくソートできるようにします。したがって、昨日の誕生日は365でソートされ、明日の誕生日は1でソートされます。

+1

閏年/ 29/02生まれの人: –

+0

@ThomasG実際、すべてのケースで動作し、私が考えることのできるすべての組み合わせをテストしました。興味深いことに、T-SQLの 'datepart(dy、@ dateval)'は3/1と2/29の両方に対して60を返します。そのため、2日間の誕生日を間違った順序で取得できます。あなたが反例を示すことができない限り、私はこの質問に立つつもりです! –

0

それは簡単です。
今年の人の誕生日はいつですか?
次に、上記の日付と今日の日付の差異を取得します。 SQLステートメントを次のように

ルック:

SELECT TOP 10 
     NAME, 
     BIRTHDAY, 
     DATEDIFF(DAY, GETDATE(), DATEFROMPARTS(YEAR(GETDATE()), MONTH(PEOPLE.BIRTHDAY), DAY(PEOPLE.BIRTHDAY))) AS RemainingDays 
FROM PEOPLE 
WHERE DATEDIFF(DAY, GETDATE(), DATEFROMPARTS(YEAR(GETDATE()), MONTH(PEOPLE.BIRTHDAY), DAY(PEOPLE.BIRTHDAY))) >= 0 
ORDER BY RemainingDays ASC 
1

私はあなたが、次のLINQクエリを使用することができます

来る誕生日を持っている10人のリストをプリントアウトしたい:

var query = db.PEOPLEs 
    .OrderBy(p => p.Birthday.Month > DateTime.Now.Month || 
     (p.Birthday.Month == DateTime.Now.Month && 
     p.Birthday.Day >= DateTime.Now.Day) ? 0 : 1) 
    .ThenBy(p => p.Birthday) 
    .Take(10); 

トリックは条件付きOrderByで、生まれたばかりの誕生日は、渡された誕生日の前です。

関連する問題