C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

年月の比較をしたい

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■92726 / inTopicNo.1)  年月の比較をしたい
  
□投稿者/ あい (3回)-(2019/10/25(Fri) 17:46:51)

分類:[データベース全般] 


MySQL

SELECT
CASE
WHEN DATE_FORMAT(CURDATE(),'%Y年%m月') > date1 THEN 0 @
WHEN DATE_FORMAT(CURDATE(),'%Y') + 1 = date1 THEN 1  A
WHEN DATE_FORMAT(CURDATE(),'%m') + 1 = date1 THEN 2  B
ELSE 3 C
END AS dateyear
FROM
Tbl1
DATE_FORMAT(date1,'%Y年%m月')

※一部省略しています。

上記のSQL文なのですが、@・A.Cは結果がちゃんと出力されるのですがBの結果がうまくいきません。
Bの実装したい結果は、来月=date1の月が来月だったら2を出力するといった内容です。

ちなみに@は今年よりdate1が過去だったら0、Aは来年=date1も来年だったら2、それ以外はCにしています。
date1が来月なのかの比較ができません。

言葉足らずかもしれないので、ご指摘お願い致します。



引用返信 編集キー/
■92731 / inTopicNo.2)  Re[1]: 年月の比較をしたい
□投稿者/ WebSurfer (1956回)-(2019/10/26(Sat) 12:58:58)
No92726 (あい さん) に返信

date1 とは何なのですか?

date1 と比較する相手は、例えば本日現在が 2019-10-26 の場合それぞれ以下のように
なるはずですが、ちゃんと比較できているのですか?

mysql> select DATE_FORMAT(CURDATE(),'%Y年%m月');
+-------------------------------------+
| DATE_FORMAT(CURDATE(),'%Y年%m月')   |
+-------------------------------------+
| 2019年10月                          |
+-------------------------------------+
1 row in set (0.01 sec)

mysql> select DATE_FORMAT(CURDATE(),'%Y') + 1;
+---------------------------------+
| DATE_FORMAT(CURDATE(),'%Y') + 1 |
+---------------------------------+
|                            2020 |
+---------------------------------+
1 row in set (0.01 sec)

mysql> select DATE_FORMAT(CURDATE(),'%m') + 1;
+---------------------------------+
| DATE_FORMAT(CURDATE(),'%m') + 1 |
+---------------------------------+
|                              11 |
+---------------------------------+
1 row in set (0.00 sec)

引用返信 編集キー/
■92750 / inTopicNo.3)  Re[2]: 年月の比較をしたい
□投稿者/ あい (4回)-(2019/10/28(Mon) 16:13:55)
No92731 (WebSurfer さん) に返信
> ■No92726 (あい さん) に返信
>
> date1 とは何なのですか?

date1はDATE型で日付データが入っております。本日であれば2019-10-28。
それぞれ個々の比較はできております。

CASE
WHEN DATE_FORMAT(CURDATE(),'%Y年%m月') > date1 THEN 0 @
WHEN DATE_FORMAT(CURDATE(),'%Y') + 1 = date1 THEN 1  A
WHEN DATE_FORMAT(CURDATE(),'%m') + 1 = date1 THEN 2  B
ELSE 3 C
END AS dateyear

上記のようにCASE文で比較しようとするとBの結果がでてきません。
書き方がいけないのでしょうか?
引用返信 編集キー/
■92751 / inTopicNo.4)  Re[3]: 年月の比較をしたい
□投稿者/ shu (1200回)-(2019/10/28(Mon) 16:21:35)
2019/10/28(Mon) 16:21:53 編集(投稿者)
No92750 (あい さん) に返信

select DATE_FORMAT(CURDATE(), '%m')+1, CURDATE()+1;
+--------------------------------+-------------+
| DATE_FORMAT(CURDATE(), '%m')+1 | CURDATE()+1 |
+--------------------------------+-------------+
|                             11 |    20191029 |
+--------------------------------+-------------+
となると思います。
つまり、11とCURDATE()+1が等しくなることは
まずありえないです。

引用返信 編集キー/
■92759 / inTopicNo.5)  Re[3]: 年月の比較をしたい
□投稿者/ WebSurfer (1957回)-(2019/10/28(Mon) 21:46:38)
No92750 (あい さん) に返信

> 書き方がいけないのでしょうか?

そうだと思います。date1 も DATE_FORMAT を使って変換して、それと比較して
みたらどうなりますか?
引用返信 編集キー/
■92766 / inTopicNo.6)  Re[4]: 年月の比較をしたい
□投稿者/ あい (5回)-(2019/10/29(Tue) 11:33:55)
No92759 (WebSurfer さん) に返信
> ■No92750 (あい さん) に返信
>
>>書き方がいけないのでしょうか?
>
> そうだと思います。date1 も DATE_FORMAT を使って変換して、それと比較して
> みたらどうなりますか?

まず、最初の投稿を確認したところ文に間違いがございました。

DATE_FORMAT(date1,'%Y年%m月')

DATE_FORMAT(DATE1,'%Y年%m月') AS date1 でした。

申し訳ございません。今後は修正した文で書かせていただきます。

<修正文> ※修正箇所
SELECT
CASE
WHEN DATE_FORMAT(CURDATE(),'%Y年%m月') > date1 THEN 0 @
WHEN DATE_FORMAT(CURDATE(),'%Y') + 1 = date1 THEN 1  A
WHEN DATE_FORMAT(CURDATE(),'%m') + 1 = date2 THEN 2  B ※
ELSE 3 C
END AS dateyear
FROM
Tbl1
DATE_FORMAT(DATE1,'%Y年%m月') AS date1
DATE_FORMAT(DATE1,'%m') AS date2 ※

上記のように修正致しました。
結果、Bの結果も出力されるようになったのですが

例えば2019年10月と比較すると2019年11月のデータだけが引っ掛かるはずなのですが、
2018年11月もBの結果になってしまいます。
本来ならば2018年11月は@の結果が出でほしいのですが…。

BをDATE_FORMAT(CURDATE(),'%Y年%m月')+1と直しても+1は年度に足されてしまうので
月の比較ができなくなってしまします。
月だけを+1にすることはできないのでしょうか?

引用返信 編集キー/
■92769 / inTopicNo.7)  Re[5]: 年月の比較をしたい
□投稿者/ あい (6回)-(2019/10/29(Tue) 12:01:41)
すみません、自己解決致しました。

※修正文
SELECT
CASE
WHEN DATE_FORMAT(CURDATE(),'%Y年%m月') > date1 THEN 0 @
WHEN DATE_FORMAT(CURDATE(),'%Y') + 1 = date1 THEN 1  A
WHEN DATE_FORMAT(DATE_ADD(CURDATE(),INTERVAL 1 MONTH),'%Y年%m月')=date1 THEN 2  B ※
ELSE 3 C
END AS dateyear
FROM
Tbl1
DATE_FORMAT(DATE1,'%Y年%m月') AS date1

DATE_ADDでINTERVAL 1 MONTH でを指定してやってみたところ2019-11-29と取得できたので
DATE_FORMATで欲しいところを指定し2019-11と取得することができました。

よって上記の文になりました。
正解なのか分からないのですが一応やりたいことはできました。
ありがとうございました。


解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ