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

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

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

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

Q&A

解決済

2回答

630閲覧

データの抽出方法について

u-sukesan

総合スコア156

MySQL

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

0グッド

0クリップ

投稿2020/10/22 03:09

編集2020/10/22 03:15

下記のようなテーブルがあります。

startからendまでを就業時間とした場合

例)
09:15:00から10:00:00の間で時間がかぶる人数を抽出したい
希望する返り値は三郎以外の3人

テーブルtimetable
|name(TEXT)|dat(DATE)|start(TIME)|end(TIME)|
|:--|:--:|--:|
|花子|2020-10-23|09:00:00|10:00:00|
|次郎|2020-10-23|09:00:00|09:45:00|
|太郎|2020-10-23|09:15:00|10:30:00|
|三郎|2020-10-23|09:00:00|09:15:00|

やってみたこと1
SELECT COUNT(*) AS cnt FROM timetable
AND DATE(dat)='2020-10-23'
AND start<='09:15:00'
AND end>='10:00:00'

返り値 2

やってみたこと2
SELECT COUNT(*) AS cnt FROM timetable
AND DATE(dat)='2020-10-23'
AND (start<='09:15:00 OR end>='10:00:00')

返り値 4

どのような考え方で抽出すればいいのでしょうか

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

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

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

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

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

m.ts10806

2020/10/22 03:14

PHPは本件とどのように関係するのでしょうか。 あと「mysqli」とありますが、これはMySQLを利用ということで良いですか? タグはなるべく正確につけられたほうが良いです。
u-sukesan

2020/10/22 03:16

失礼しました、mysqliはタグのつけ間違いです。 phpに関しては、作業中のファイルがphpでしたのでつけてしまいました。 おっしゃる通り関係ありませんので外しました。
yambejp

2020/10/22 03:27

三郎のend(TIME)である09:15:00は就業時間に含まれないのですね?
u-sukesan

2020/10/22 03:32 編集

yambejp 様 ありがとうございます はい、含まないです。 逆もしかりです 四郎 2020-10-23 10:00:00 10:15:00 という人がいたら、start(TIME)の10:00:00も含まないです
Orlofsky

2020/10/22 03:31

以前いっしょに開発したメンバーの人が何年か前に、勤怠管理システムで昼勤しかなったとこに夜勤が追加になって、日付をまたぐ出退勤が生じて質問のようなテーブル設計で大変更が必要になったと、実際はトラブルが発生すると職場に2日以上完徹になる人も発覚して、出勤も退勤も最初からDATE型を使っておいてくれたら ... と嘆いていました。
u-sukesan

2020/10/22 03:34

Orlofsky 様 アドバイスありがとうございます。 今回は日付をまたがないという条件で大丈夫です。
guest

回答2

0

日付をまたがないという前提付きで、
思いつく条件としては、

・startが09:15:00から10:00:00の間
または
・endが09:15:00から10:00:00の間
または
・startが09:15:00より前、endが10:00:00のより後

と、

・endが09:15:00より前 または startが10:00:00より後
以外

です。

投稿2020/10/22 03:52

Gak

総合スコア83

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

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

Gak

2020/10/22 03:55

先の回答がすっきり整理されてましたm(_ _)m
u-sukesan

2020/10/22 04:01

先の回答で思い通りの結果を得ることができましたが、考え方を理解したので、大変参考になりました。 ありがとうございます。
guest

0

ベストアンサー

sql

1select * from timetable where dat='2020-10-23' and start<'10:00:00' and end>'09:15:00';

投稿2020/10/22 03:50

編集2020/10/22 03:51
yambejp

総合スコア114572

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

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

u-sukesan

2020/10/22 04:00 編集

ありがとうございました 思い通りの結果を得られました なぜそうなるのか、いろいろ試しながら理解したいと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問