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

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

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

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

Q&A

解決済

3回答

6803閲覧

SQLでの時差の求め方

Terua

総合スコア11

SQL

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

0グッド

1クリップ

投稿2016/06/05 11:14

こちらで質問させていただくのは初めてなので
分かりづらかったら申しありません。

###実現したいこと

やりたいことは、SQLでの日付の計算です。

データベースから文字列で"年月日","時分1","時分2","時分3","時分4" とデータを取得して、
時分間の時差を分単位で求めたいのです。
データの例 ("20160605", "1200", "1800", "2100", "2330")
求めたい値 (360(6時間) , 180(3時間) ,150(2時間30分) )

取得するのが、文字列でデータの形式("HHMM") は固定です

###発生している問題
現状では、文字列をDATE型に変換し計算しているのですが、
その際に、時間が 00:00 ~ 23:59 の間でないと計算ができないため、
計算したい値が 23:00 ~ 24:00 や 23:30 ~ 24:30 の場合に
エラーが発生してしまい、計算ができなくて困っています

###該当のソースコード

TO_NUMBER(TO_DATE("時分2","HH24MS" ) - TO_DATE("時分1" , ""HH24MS) ) *24 * 60 )

現在コードが見れないため、うろ覚えですが、こんな感じで作ってます。
まず、フォーマットを直さなければと、思うのですが、
どう書いたらいいか分からないため、このままです。

どうかお力をお貸しください、お願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

TO_NUMBERを使っていることから、DBはOracleと推測して回答します。

TO_DATEで指定できる時刻(HH24)は、0~23までなので、
24や25を突っ込むと当然エラーになります。

なので少し加工してやる必要があります。
以下のような感じです。

※テーブルの各カラムは文字列型という前提です。

sql

1SELECT 2 CASE WHEN TO_NUMBER(時分1) >= 2400 3 THEN TO_DATE(年月日 || TO_CHAR(TO_NUMBER(時分1 - 2400)), 'YYYYMMDDHH24MI') + 1 4 ELSE TO_DATE(年月日 || 時分1, 'YYYYMMDDHH24MI') 5 END 時分1 6-- 時分2,3,4も同様に 7FROM テーブル

これは何をしているかというと、時分1が24時以降の場合、時分1から2400を引き、
年月日を結合して日付型に変換し、24時以降は翌日になるので日付を1日加算しています。
時分1が2400以上でない場合は、年月日と時分1を結合して日付型に変換するのみです。

こうしてできた値に対して、日付計算をしてやれば24時以降のデータについても計算ができます。
サブクエリで加工し、メインクエリで計算するのがよろしいかと思います。

なお、翌々日(48時以降)は考慮していません。

※提示したSQLについては、手元にOracleの環境がないので検証していません。
間違っていたら申し訳ありません。

投稿2016/06/06 04:58

gusao

総合スコア185

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

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

0

Oracleだと以下になります。

SQL

1select (to_date('18:00','hh24:mi') - to_date('12:00','hh24:mi')) * 24 * 60 from dual;

OracleだとDATE型同士で計算すると日付で算出されますので、
×24h×60minで求めたいものが算出できるかと思います。

投稿2016/06/06 03:36

Yuna.S

総合スコア81

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

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

0

どのDBか解らないですが、例えばmysqlなら次のような感じでどうでしょう?

SQL

1select TIMEDIFF(time('18:00'),time('24:30')); 2//-06:30:00

参考ページ

投稿2016/06/05 13:34

編集2016/06/05 13:40
hirohiro

総合スコア2068

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問