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

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

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

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

SQL

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

Q&A

解決済

4回答

1981閲覧

MySQL 複数の日付範囲の検索方法

hasaya

総合スコア4

MySQL

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

SQL

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

0グッド

0クリップ

投稿2021/08/30 01:44

編集2021/08/30 02:01

前提・実現したいこと

お世話になります。MySQLでsalariesテーブルの2020年に支払われたsalaryの合計値を出したいと考えています。

salariesテーブル

salary(INT)from_date(DATE)to_date(DATE)
600002020-01-012020-01-31
400002020-03-012020-03-31
500002019-01-012019-01-01

例えばfrom_date1つだけで検索するとなると下記でできると認識しています。

SELECT sum(salaries.salary) FROM salaries WHERE salaries.from_date >= "2020-01-01" AND salaries.from_date <= "2020-12-31";

しかし今回のように複数の日付範囲から指定する場合、どのように取得すればよいか悩んでおります。
恐れ入りますがご教示いただきたく存じます。

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

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

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

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

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

guest

回答4

0

業務上の問題としてとらえた場合、これは、SQLの問題ではなく、仕様の問題です。
「2020年に支払われたsalary」を、もう少し正確に決めましょう。
可能性としては、以下など、幾つかが考えられます。
なお、前提として、from_dateとto_dateは、salaryの計算根拠の労務期間の始終日と仮定します。

・支払日が2020年のsalary
この場合、from_dateもto_dateも関係なく、支払日のデータが必要になります。

・経理上の給与年月が、2020年1月から12月のsalary
この場合、from_dateとto_dateから、給与年月を導く式が必要となります。

・労務期間が1日でも2020年に含まれるsalary
この場合、以下の条件になります。
'2020-01-01' <= to_date and '2020-12-31' <= from_date

・労務期間が2020年に相当する分のsalary
これは、日単位で考える方法で、按分の方法などを別途定める必要があります。

これ以外にも、考えられるかもしれません。

なので、まず、hasayaさんの言う「2020年に支払われたsalary」の正確な意味を決定してください。

投稿2021/08/31 05:13

YT0014

総合スコア1719

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

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

0

複数の日付範囲から指定する場合

が、実際は「 年を跨ぐ日付範囲から指定する場合 」であった場合。

パラメータ:

p1p2
2020-01-012020-12-31

テーブル: 対象範囲

_from_to
2018-01-012019-12-31
2019-09-012020-03-31
2020-05-012020-08-31
2020-11-012021-02-28
2019-01-012021-01-31
2021-04-012021-08-31

だったとします。

パラメータp1 .. p2
対象範囲_from .. _toに一部でも内在するかどうかを判定するには
以下のように記述します。

SQL

1SELECT * 2 FROM 対象範囲 t 3 WHERE t._to >= date '2020-01-01' 4 AND t._from <= date '2020-12-31' 5;

■結果

_from_to
2019-09-012020-03-31
2020-05-012020-08-31
2020-11-012021-02-28
2019-01-012021-01-31

投稿2021/08/30 05:07

mayu-

総合スコア335

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

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

0

そもそも運用の問題では?
年をまたがる日付の設定をすると2020年が一部だけ含まれる
支払いが表現できなくなるので設定自体が無意味でしょう
したがってto_dateの年月はfrom_dateと同じという前提で組んで

from_date between '2020-01-01' and '2020-12-31'とするか
集計を前提にdate_formatしておいた生成列をつくっておけばよいでしょう

SQL

1create table tbl(id int primary key, 2salary int,from_date date,to_date date, 3from_y int as (date_format(from_date,'%Y')), 4index(from_y) 5); 6insert into tbl(id,salary,from_date,to_date) values 7(1,60000,'2020-01-01','2020-01-31'), 8(2,40000,'2020-03-01','2020-03-31'), 9(3,50000,'2019-01-01','2019-01-01'); 10 11select * from tbl where from_y=2020 12

投稿2021/08/30 02:24

yambejp

総合スコア116441

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

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

0

ベストアンサー

()で括った上でorでつなぐとかどうでしょう

sql

1( 2salaries.from_date >= "2020-01-01" 3AND salaries.from_date <= "2020-12-31" 4) 5or 6( 7salaries.from_date >= "2021-06-01" 8AND salaries.from_date <= "2021-12-31" 9)

between使ったほうが短くなりそうですけどね。

投稿2021/08/30 01:58

m.ts10806

総合スコア80875

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

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

hasaya

2021/08/30 02:09

コメントありがとうございます! すみません私の質問文がおかしくなってました。 今回from_dateとto_dateの2つのカラムが存在しており、例えば2020年のsalaryの合計値を出したいとする場合、2つのカラムを考慮する必要があると思うのですがその場合にどういうSQLにするのかを知りたいというのが正しい質問でした。
m.ts10806

2021/08/30 02:35 編集

fromからtoで月をまたぐケースはないですか? いずれにしても当年の実績なわけですから元々toを考慮する必要なく、fromを年だけ抽出するフォーマットかけた上でイコールにすれば良さそうに思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問