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

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

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

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

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

Q&A

解決済

1回答

10661閲覧

oracleで勤務時間の計算

grifet

総合スコア8

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

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

0グッド

0クリップ

投稿2017/02/03 04:32

お世話になります。

下記のようなテーブルから、その月の勤務時間を計算したいです。
タイプIが出勤 タイプOが退勤のレコードです。
また、打刻時間はdate型です。

ユーザーID打刻時間タイプ
admin2017-02-01 09:00:00I
admin2017-02-01 18:00:00O
user2017-02-01 09:00:00I
user2017-02-01 18:00:00O
admin2017-02-02 09:04:00I
admin2017-02-02 18:12:00O

現在のSQL文は下記のような感じです。
宜しくお願いします。

SQL

1SELECT 2 TO_CHAR(TO_TIMESTAMP(o.打刻時間) - TO_TIMESTAMP(i.打刻時間), 'HH24MI') AS work_time 3FROM 4 表 i 5 INNER JOIN 6 表 o 7 ON i.ユーザーID = o.ユーザーID 8 AND TO_CHAR(i.打刻時間, 'YYYY/MM/DD') = TO_CHAR(o.打刻時間, 'YYYY/MM/DD') 9WHERE 10 i.user_id = 'admin' 11 AND i.タイプ= 'I' 12 AND o.タイプ = 'O'

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

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

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

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

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

guest

回答1

0

ベストアンサー

環境がoracleではないので、未検証ですが下記の様なSQLでいけないでしょうか?

SQL

1Select 2ユーザID,sum(o.打刻時間 - i.打刻時間) 3from 4(select ユーザID,打刻時刻 from 勤怠 where タイプ = 'I') as i 5inner join 6(select ユーザID,打刻時刻 from 勤怠 where タイプ = 'O') as o 7On i.ユーザID = o.ユーザID 8/*Group by を追記*/ 9Group by ユーザID

投稿2017/02/03 04:54

編集2017/02/03 05:24
motuo

総合スコア3027

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

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

grifet

2017/02/03 05:20

ご回答ありがとうございます。 書き損じていたのですが、その月の勤務時間の合計を、 ユーザーID毎に合計して出したいのです。 現在のSQLですと、複数結果(?)でてしまうので・・ また、実行してみたところ、 -.625 .375 .375 .375 1.375 のようになってしまい、よくわかりません・・
motuo

2017/02/03 05:22

であれば、group by ユーザIDとすれば良いのではないでしょうか?(回答修正します)
grifet

2017/02/03 05:38

重ね重ねすみません。 実行結果が admin 1.5 user .375 のようになるのですが、 何時間、何分といったような表示にするには、 どのようにすれば良いのでしょうか。 宜しくお願いします。
motuo

2017/02/03 05:57

date型は1/24で1時間を管理しています。なので、逆に24をかけてあげると時間になります。 さらに60をかけると分になります。1440をかけると分単位で出力できます。 結果、adminは2140分(36時間)、userは540分(9時間)になっている様に見えます。 よって、to_char(trunc(算出した分/60),'fm00')||':'||to_char(mod(算出した分,60),'fm00')とすれば良いのではないでしょうか。
grifet

2017/02/03 06:22

なるほど…。 ありがとうございます。 しかし、adminは18時間しか働いていないはずなので、 i.ユーザーID, SUM(o.打刻時間- i.打刻時間)*24 ON i.ユーザーID = o.ユーザーID AND TO_CHAR(i.打刻時間, 'YYYY/MM/DD') = TO_CHAR(o.打刻時間, 'YYYY/MM/DD') としたところ、admin18,user9 となったのですが、 こういう書き方(?)で良いのでしょうか?
motuo

2017/02/03 06:29

そうですね。確かに日付で結合する必要がありましたね。その書き方でよろしいかと思います。
grifet

2017/02/03 06:38

ありがとうございます。 長々とお付き合いくださりありがとうございました。 また私の質問を見かけた際は宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問