質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

2044閲覧

4月1日を含む週を先頭にした週番号

bottle

総合スコア12

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/02/14 02:44

編集2019/02/14 04:31

前提・実現したいこと

ISO規格だと1月からスタートした週番号で
かつ、過半数が含まれているほうに週番号'1'が設定される(1月1日が前年の53週目になる)
4月1日を含む週を週番号の'1'にしたい
(4月1日が金曜だった場合3月28日の週から順番に番号を振っていく)

試したこと

単純に月を減算する→日付のデータ自体は変わらないことに気づく
4月1日の曜日を抽出し、対応する日数を日付から減算する
→他テーブルを使わないといけなくなり頓挫

補足情報(FW/ツールのバージョンなど)

SQLデベロッパ-バージョン17.4.0.355を使用

曜日番号は日曜日が1で土曜日が7の順序になり、求める週番号は月曜スタートになります。
今年だと4/1は月曜になるので
4/14/7までが週番号'1'
4/8
4/14までが週番号'2'
となっていくようにしたいです。

テーブル名:'DATE'
カラム:YEAR char
MONTH char
DAY char
NYEAR(年度) char
K_DAY(曜日番号) char
YMD(年月日) DATE
KI(0→前期,1→後期) char

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/02/14 02:48

曜日番号は0が日曜日で開始ということで良いですよね? 仕様をもう少し明確に書かれた方がいいかもしれません。
m.ts10806

2019/02/14 02:49

あと念のためSQLのデータベースの種類とバージョンを追記してください(種類についてはタグにも追加をお願いします)
mather

2019/02/14 02:59

今年でいうと4/1が月曜日なので、 3/30(土) -> 3/31(日) -> 4/1(月) -> 4/6(土) -> 4/7(日) -> のような具体的な日付がどんな週番号になるべきかを質問に追記しましょう。
guest

回答3

0

ベストアンサー

日次書式モデル ISO 8601標準 IW, IYYY

SQL

1ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD' ; 2 3SELECT 4 TO_CHAR(A.YMD, 'YYYY/MM/DD IYYYIW') AS YMD 5FROM( 6 SELECT TO_DATE('2019/01/01', 'YYYY/MM/DD') AS YMD FROM DUAL UNION ALL 7 SELECT TO_DATE('2019/03/30', 'YYYY/MM/DD') AS YMD FROM DUAL UNION ALL 8 SELECT TO_DATE('2019/03/31', 'YYYY/MM/DD') AS YMD FROM DUAL UNION ALL 9 SELECT TO_DATE('2019/04/01', 'YYYY/MM/DD') AS YMD FROM DUAL UNION ALL 10 SELECT TO_DATE('2019/04/07', 'YYYY/MM/DD') AS YMD FROM DUAL UNION ALL 11 SELECT TO_DATE('2019/04/08', 'YYYY/MM/DD') AS YMD FROM DUAL UNION ALL 12 SELECT TO_DATE('2019/12/31', 'YYYY/MM/DD') AS YMD FROM DUAL UNION ALL 13 SELECT TO_DATE('2020/01/01', 'YYYY/MM/DD') AS YMD FROM DUAL UNION ALL 14 SELECT TO_DATE('2020/03/30', 'YYYY/MM/DD') AS YMD FROM DUAL UNION ALL 15 SELECT TO_DATE('2020/03/31', 'YYYY/MM/DD') AS YMD FROM DUAL UNION ALL 16 SELECT TO_DATE('2020/04/01', 'YYYY/MM/DD') AS YMD FROM DUAL UNION ALL 17 SELECT TO_DATE('2020/04/07', 'YYYY/MM/DD') AS YMD FROM DUAL UNION ALL 18 SELECT TO_DATE('2020/04/08', 'YYYY/MM/DD') AS YMD FROM DUAL UNION ALL 19 SELECT TO_DATE('2020/12/31', 'YYYY/MM/DD') AS YMD FROM DUAL 20 ) A ; 21 22YMD 23---------------------------------- 242019/01/01 201901 252019/03/30 201913 262019/03/31 201913 272019/04/01 201914 282019/04/07 201914 292019/04/08 201915 302019/12/31 202001 312020/01/01 202001 322020/03/30 202014 332020/03/31 202014 342020/04/01 202014 352020/04/07 202015 362020/04/08 202015 372020/12/31 202053 38 3914行が選択されました。

だから、
IW > 13 は マイナス 13 それ以外はプラス13 で 4月頭頃(4月1日が初日ではない)を年度の第1週とするFUNCTIONを作って対応しては?
これで良いかは社内できちんと検討してください。

投稿2019/02/14 05:17

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bottle

2019/02/14 05:29

回答ありがとうございます。 社内で話し合ってみます!
guest

0

4月1日は1月1日から数えて90ないし91日後(31+28or29+31)なので、曜日のずれは90 mod 7 = 6(つまり一つ戻る)か、91 mod 7 = 0(同じ曜日)になります。

1月1日の曜日平年の4月1日の曜日閏年の4月1日の曜日

ISO 8601 ではぶっちゃけ、1月1日が「金・土・日」の場合は前の週から始まったことになるので、これを4月1日基準にする場合も同様に補正してやらねばならないでしょう。
※上の表で太字になっている部分は、週番号が1減る

従って通常は1月1日起算の週番号で、(m月d日の週番号)-(4月1日の週番号)でよいのですが、
・平年で4月1日が日曜日の場合
・平年で4月1日が木曜日の場合
は、補正が必要になるかと思います。

投稿2019/02/14 04:38

編集2019/02/14 04:39
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bottle

2019/02/14 04:47

回答ありがとうございます。 ISOの週番号で計算して4月1日の週番号を減算 曜日を取得してCASE~WHEN文などで補正を加える ということで問題ないでしょうか?
guest

0

思いつきレベルですが、5/1の週番号(おそらく仕様からすると5)を求めたいとして
↓こういうことではないのですか?

SQL

1SELECT WEEK('2019-05-01',3) - WEEK('2019-04-01',3) + 1;

同じ年度かの検証は、1/1はじまりでも必要な話なのでやっているとして、負になったら4/1の週番号と求めたい日の週番号の加算(と1の調整)で求まりそうなんですが?

※ すみません、MySQLでやってるので、WEEKの使いかたは考えてません。

投稿2019/02/14 03:15

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bottle

2019/02/14 04:36

同年度の検証は行っております。 WEEKについてなのですが、無効な識別子とエラーが出て使用できません。
bottle

2019/02/14 04:36

すいません!回答ありがとうございます!返信送れて申し訳ありません!
papinianus

2019/02/14 04:41

WEEKはOracleだとTO_DATE(日付, 'IW')みたいな表現っぽいです
bottle

2019/02/14 04:50

返信ありがとうございます。 TO_DATE構文でいろいろ試してみたのですがエラーがでて実行できません。 エラーは 日付の書式コードが無効です とでます。 クオーテーションをはずしたりカラム名で問い合わせてみたりしたのですが、
papinianus

2019/02/14 04:54

Oracleで週番号がそもそも得られない、という質問だとは思っていなかったので、すみませんがお力になれません。 回答の趣旨は、目的の日の週番号と基準としたい日の週番号との加算または減算で求まる性質の事柄ではないでしょうか、という点に尽きます。
bottle

2019/02/14 05:09

返信ありがとうございます。 TO_CHAR構文をさらにくっ付けると週番号は求めることができたのですが(1月基準) 減算などをしようとするとエラーが出るようです。
papinianus

2019/02/14 05:12

数値じゃないのですね。では週番号から加減算しようとするのはoracleでは無理みたいですね。失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問