🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
date

dateは、date型や日付に関する関数や処理についてのタグです

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

Q&A

解決済

2回答

3394閲覧

MySqlで前月比を取得する際に前月が31日、今月が30日の月末で2行でてきてしまう

yamame01

総合スコア16

date

dateは、date型や日付に関する関数や処理についてのタグです

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

0グッド

0クリップ

投稿2019/11/11 04:58

編集2019/11/11 06:56

前提・実現したいこと

MySqlにて前月比を表示させたいと思っておりますが、月末処理にて想定通りに結果を取得できません。

想定する値

|order_date|price|last_order_date|last_price|
|:--|:--:|--:|
|7/31|1000|6/30|4000|
|8/31|2000|7/31|1000|
|9/30|1000|8/30|2000|

発生している問題

8月と9月のように前月が31日、今月が30日の場合に、9/30のレコードは2日分出てしまいます。

該当のソースコード

SQL

1SELECT 2 TM.order_date, 3 TM.price, 4 LM.order_date as last_order_date, 5 LM.price AS last_price 6FROM sample_table TM 7LEFT OUTER JOIN sample_table LM 8AND TM.order_date = DATE_ADD(LM.order_date, INTERVAL 1 MONTH)
取得結果

|order_date|price|last_order_date|last_price|
|:--|:--:|--:|
|9/30|1000|8/30|2000|
|9/30|1000|8/31|2000|

試したこと

SQL

1DATE_ADD('2019/08/30', INTERVAL 1 MONTH) 2DATE_ADD('2019/08/31', INTERVAL 1 MONTH)

が共に2019/9/30を返すことを確認しております。

基本的なことになるとは思うのですが、ご教授いただけますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

maisumakun

2019/11/11 04:59

どのような結果を「想定」していたのでしょうか。
yamame01

2019/11/11 05:01

前提・実現したいこと > 想定する値 に記載しております値を期待しております。
maisumakun

2019/11/11 05:03

逆に、7月31日の前月比はどのように処理すればいいでしょうか。
yamame01

2019/11/11 06:57

情報が足らず申し訳ありません。 7/31の場合は、前月の最終日(6/30)との比較にしたいです。 想定する値に追記いたしました。
guest

回答2

0

自己解決

自己解決しましたのでコメントいたします。
回答くださった方、ありがとうございました。

1つのSQLではできなかったので(私は存じ上げないのですがoracleのwith句みたいなのを使用すれば1つのSQLでできそうです)、2つのSQLに分けて行いました。

前月日付取得まで(sample_table2としてデータを一時保持)

SQL

1SELECT 2 order_date, 3 price, 4 DATE_SUB(order_date, INTERVAL 1 MONTH) as last_order_date 5from sample_table

前月の値を表示するため、自己結合

SQL

1select 2 TM.order_date, 3 TM.price, 4 LM.order_date as last_order_date, 5 LM.price as last_price 6from sample_table2 TM 7left outer join sample_table2 LM 8on TM.last_order_date = LM.order_date

投稿2019/11/11 12:05

yamame01

総合スコア16

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

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

0

9/30のレコードは2日分出てしまいます。

命題を見る限り2日分でないとまずいですね
仮に8/30を参照すると、8/31のデータが使われないことになります
逆に8/31を参照すると、8/30のデータが(以下略)

投稿2019/11/11 05:05

yambejp

総合スコア116661

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

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

yamame01

2019/11/11 06:03

ご回答ありがとうございます! 前月比となりまして、前月の同じ日(9/30なら8/30)との比較をしたいため 8/31の値は使わないようになります。 結合する際に、9/30は8/30のみ結合できるように条件を指定したいのですが 適切な方法を思いつかなかった為質問させていただきました。 よろしくお願いいたします。
yambejp

2019/11/11 07:08

逆に10/31の前月の同じ日は存在しませんがどうするのでしょうか?
yamame01

2019/11/11 07:42

その場合は、前月の最終日である9/30としたい次第です。 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問