年-週 (例: 0852 または 200852) を日付 (例: 2008-12-31 または具体的には週の終了日、つまり土曜日 2008-12-27 または週の開始日、つまり 2008-12-21) に変換するにはどうすればよいですか? ) ? 金曜日、土曜日、日曜日、または月曜日のいずれかの週の終わりの日が対象です。
6 に答える
MS SQL SERVER には、役立つはずの DATEADD 機能があります...
DECLARE @date_string NCHAR(6)
SELECT @date_string = N'200852'
SELECT DATEADD(
WEEK,
CAST(RIGHT(@date_string, 2) AS INT),
DATEADD(
YEAR,
CAST(LEFT(@date_string, 4) AS INT) - 1900,
0
)
)
編集:
すみません、土曜日にすることについて少し逃しました...
値を取得したら、DATEPART を使用してその曜日を取得し、それを答えから差し引きます...
DECLARE @new_date DATETIME
SELECT @new_date = '2008 Dec 30'
SELECT DATEADD(DAY, 1-DATEPART(dw, @new_date), @new_date)
これにより、DATEFIRST の設定内容に応じて、値が週の初めになります。
それが重要な場合、これはほとんどデータベースに依存しないソリューションです。
使用する予定の日付のすべての属性をリストする ALMANAC という名前の表、主キー DATE を作成します。それらの 1 つは YEAR であり、もう 1 つは WEEK である可能性があります。頻繁に使用したい DATE の計算可能な関数を含めることができます。日付が会社の休日かどうかなど、会社固有の DATE 属性を含めることもできます。
たとえば 10 年間 (約 3650 行と閏年) 分の DATE を設定する 1 つのプログラムを作成します。このプログラムは、DBMS またはプログラミング言語で使用できる環境固有の日付関数を使用します。ALMANAC テーブルに入力したら、通常のデータのように使用します。主キーをデータベース内の任意の日付フィールドと結合します。
これは、週別、月別、四半期別、年別のレポートをほぼ自動的に作成する場合に非常に便利です。
DATE の粒度が十分でない場合は、Almanac をより小さな時間単位に分割することもできます (3 シフトが 1 日であるシフトなど)。
日付関数は、ほとんどデータベース固有です。たとえば、MySQL では、次のようにして月曜日を 'YYYYWW' 形式で取得できます。
select date_sub(makedate(left('YYYYWW', 4), 1 + (right('YYYYWW', 2) - 1) * 7),
interval weekday(makedate(left('YYYYWW', 4), 1 + (right('YYYYWW', 2) - 1) * 7)) DAY);
makedate(left('YYYYWW', 4), 1 + (right('YYYYWW', 2) - 1) * 7) を使用すると、特定の週と年に確実に含まれる日付が得られ、date_sub 関数を使用すると、その週の月曜日に戻ります。
例:
- 「200906」の場合、「2009-02-02」が返されます
- 「200901」の場合、「2008-12-29」が返されます (これは実際には 2009 年の第 1 週の月曜日です)
オラクルの場合:
SELECT TO_DATE('04.01.' || SUBSTR(iso, 1, 4)) + (TO_NUMBER(SUBSTR(iso, 5, 2))) * 7 - TO_CHAR(TO_DATE('04.01.' || SUBSTR(iso, 1, 4)), 'D')
FROM (
SELECT '200101' AS iso
FROM dual
)
これが Oracle にある場合は、さまざまなオプション、YYYYWW を使用して TO_Date 関数を確認してください。デュアルから TO_Date ('200852' YYYYWW) を選択します。
http://www.oradev.com/oracle_date_format.jsp 週の始まりを取得したら、いつでも日数を追加して週末の日付を取得できます。