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

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

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

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

Q&A

解決済

5回答

1610閲覧

【MySQL】2つの日付カラムの範囲が1か月以内かの判定

tomoyuki123

総合スコア273

MySQL

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

0グッド

0クリップ

投稿2018/02/14 04:53

start_dateとend_dateの範囲が1か月以内のものを取得したいです。
以下だと1行目だけ取得して、2行目は取得したくないです。

MySQL

1+-------+---------------------+---------------------+ 2| id | start_date | end_date | 3+-------+---------------------+---------------------+ 4| 10001 | 2017-10-29 00:00:00 | 2017-11-26 22:55:11 | 5| 10002 | 2017-10-29 00:00:00 | 2017-12-02 00:40:01 | 6+-------+---------------------+---------------------+

最初はend_dateからstart_dateを引き算して1か月か判定しようとしました。
ただ月によって月の日数(30, 31, 28)は違うのでどうすればいいのか困っています。
また上記は考慮しなくてもいいですがうるう年も考慮するとしたらどうすればいいのでしょうか。

どなたか教えて頂いてよろしいでしょうか?
MySQL5.7です。(案件によっては5.6も使うことがあります。)

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

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

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

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

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

guest

回答5

0

ベストアンサー

「一ヶ月以内」をどう定義するか次第でしょうね
たとえば2月が28日までだとして

  • 1/28と2/28
  • 1/29と2/28
  • 1/30と2/28
  • 1/31と2/28

どこが区切りになるか仕様を決める必要があります。
その上で、うるう年をどうするかも追加で定義が必要です。

決めかねるなら1ヶ月という曖昧なものではなく
「30日以内」とか、起点日の翌月末までとか普遍性のある定義をすべきです

投稿2018/02/14 05:00

yambejp

総合スコア114814

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

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

tomoyuki123

2018/02/14 11:28

皆様ありがとうございました!
guest

0

12.7 日付および時間関数 - DATEDIFF で31日以内

CREATE TABLE TEST (`DATE` DATE); INSERT INTO TEST VALUES ('2018-01-01'),('2018-01-31'), ('2018-02-01'),('2018-02-28'), ('2018-03-01'),('2018-03-31'), ('2018-04-01'),('2018-04-30'), ('2018-05-01'),('2018-05-31'), ('2018-06-01'),('2018-06-30'), ('2018-07-01'),('2018-07-31'), ('2018-08-01'),('2018-08-31'), ('2018-09-01'),('2018-09-30'), ('2018-10-01'),('2018-10-31'), ('2018-11-01'),('2018-11-30'), ('2018-12-01'),('2018-12-31'); SELECT T1.DATE AS DATE_1 ,T2.DATE AS DATE_2 FROM TEST T1,TEST T2 WHERE ABS(DATEDIFF(T2.DATE,T1.DATE)) < 31 AND T1.DATE < T2.DATE -- これは疑似テーブルのため必要なだけ

同、開始月の日数分

SELECT T1.DATE AS DATE1 ,T2.DATE AS DATE2 FROM TEST T1,TEST T2 WHERE DATEDIFF(T2.DATE,T1.DATE) < DAY(LAST_DAY(T1.DATE)) AND T1.DATE < T2.DATE -- これは疑似テーブルのため必要なだけ

投稿2018/02/14 06:17

編集2018/02/14 07:13
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

OracleのADD_MONTHSをMySQLのDATE_ADDに置き換えるとき気をつけること は参考にしていただくとして、閏日の有無による判断方法は決めておいた方がよさそうです。

投稿2018/02/14 05:11

Orlofsky

総合スコア16415

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

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

0

12.7 日付および時間関数
DATE_ADD()でINTERVAL -1 MONTHとしてみてください。

投稿2018/02/14 05:05

unz.hori

総合スコア1057

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

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

0

課題を読み替えると、

  • start_date の1か月後と、end_date とを比較して、end_date の方が過去であれば取得

と言えます。
なので、

SQL

1where DATE_ADD(start_date, INTERVAL '1 MONTH') >= end_date

で行けそうです。

ただし、DATE_ADD の結果月が変化する場合、日が新しい月の末日より後になる(2018/01/30 の1か月後とか)場合は、新しい月の末日になるように調整されます(参考)。

投稿2018/02/14 05:04

tacsheaven

総合スコア13703

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問