2017-12-12 20 views
2

興味深いソート方程式です。私は毎月の第2週曜日の金曜日を検索する最もクリーンな方法を探しています。週が月曜日に始まると仮定します。SQL:月曜日の金曜日の取得

  • 2017年11月はだろう。
  • 12月2017は、15thとなります。
  • 1月2018は、12thとなります。

これらのことは通常楽しいですが、今は気分が変わっていません。助言がありますか?個人的に

+0

この[日付表](https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/)をご覧ください。アーロン・バートランド。あなたは好きなようにそれを照会することができますが、あなたは非常に良い出発点を持っています。 –

+0

ヒント:適切なソフトウェア(MySQL、Oracle、DB2など)とバージョンの両方でデータベースの質問にタグを付けると便利です。 'sql-server-2014'です。構文と機能の相違は、しばしば答えに影響します。 'tsql'は選択肢を絞り込みますが、データベースは指定しないことに注意してください。 – HABO

答えて

3

これは、最初に理解することは容易ではないかもしれませんが、この特定のケースのためにルールは単純です:週は月曜日に開始した場合

weekday = 'Friday' (or whichever way to determine if this day is Friday) 
and day_of_month between 12 and 18 

これは動作します。作業週が月曜日に始まる場合

+0

それは本当にシンプルで優れたテイクです。私はこれらのことを思う傾向があります。 – hack3rfx

+0

毎月第2週目の金曜日の金曜日が12日と18日の間になるため、私自身の参考資料と他の人のメモに注意してください。第3週目の金曜日は決して第18日以降に来ることはなく、第1週目の金曜日は12日前または12日に決して落ちません。ユースケースは非常に特殊ですが、「単純に保つ」という概念は、グローバルに適用できます。 – hack3rfx

0

は、私はこのようなもののために日付テーブルを好きですが、あなたは数学のそれをすることもできます:5を微調整する必要があるかもしれない

CASE WHEN datepart(weekday, '2017-12-01')<=5 THEN 7 ELSE 14 END + (7-datepart(weekday, '2017-12-01')) 

ことが、私はそれが日曜日基づいてdatepart(weekdayので、右だと思うし、あなた(適切に相殺するためには6である必要があるかもしれない)。

いずれにせよ、これは野球場に入るはずです。

1

は、その後、月の第二の完全な作業週の金曜日は@fdomが月の初日である

SELECT DATEADD(day, (9 - DATEPART(weekday, @fdom)) % 7) + 11, @fdom) 
     AS SecondWorkweekFriday; 

-- 1. start with the first day of the month (@fdom) 
-- 2. advance to the nearest Monday with modular arithmetic 
-- n.b.: by default DATEPART considers Monday to be ordinal 
--   week day #2, thus "7 - DATEPART() + 2" becomes 
--   "9 - DATEPART" 
-- 3. add eleven days to get to the second Friday thereafter 

です。 first day of the monthをSQLで見つける方法はたくさんあります。

関連する問題