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

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

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

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

Q&A

解決済

2回答

2883閲覧

SQL文でTIMESTAMP型を使って現在日付から何日前かを出力したい

退会済みユーザー

退会済みユーザー

総合スコア0

SQL

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

0グッド

0クリップ

投稿2019/09/18 06:19

編集2019/09/18 06:33

前提・実現したいこと

SQLPlusでTIMESTAMP型で設定した日時が現在日時から何日前のものかを出すSQL文を作っています

発生している問題・エラーメッセージ

(SYSTIMESTAMP-LOGIN_DATE_AND_TIME) AS 最終ログイン日時(日前)
の結果以下のようになりました

+0000000「00」 00:23:08.733000
+000000「815」 16:25:00.733000
+000000「151」 15:24:45.733000
+0000000「87」 09:17:55.733000
+0000000「28」 02:47:43.733000

「」内が何日前のところになると思うのですがそこだけを抽出することは可能でしょうか

該当のソースコード

SELECT PLAYER_LIST.PLAYER_ID AS プレイヤーID,
PLAYER_NAME AS 名前,
(SYSTIMESTAMP-LOGIN_DATE_AND_TIME) AS 最終ログイン日時(日前)
FROM DUAL,PLAYER_LIST;

※LOGIN_DATE_AND_TIMEには設定した日時が入っています

試したこと

日にちだけ引けないものかと試してみましたが

SELECT PLAYER_LIST.PLAYER_ID AS プレイヤーID, PLAYER_NAME AS 名前,(SYSTIMESTAMP(dd)-LOGIN_DATE_AND_TIME(dd)) AS 最終ログイン日時(日前)
*
行1でエラーが発生しました。:
ORA-30088: datetime/intervalの精度が範囲外です

と出てしまいました。

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

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

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

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

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

sazi

2019/09/18 06:28

> +0000000「00」 00:23:08.733000 上記のようなデータは何を表してますか? LOGIN_DATE_AND_TIMEの内容?
退会済みユーザー

退会済みユーザー

2019/09/18 06:32

(SYSTIMESTAMP-LOGIN_DATE_AND_TIME) AS 最終ログイン日時(日前)の結果になります!
sazi

2019/09/18 07:05 編集

質問にあるSQLの結果という事ですね。
Orlofsky

2019/09/18 09:09

質問に LOGIN_DATE_AND_TIME 列のデータ型やその列が存在するテーブル名がわかるように CREATE TABLE, LOGIN_DATE_AND_TIME の内容がわかるようにデータのINSERTを提示できると適切なコメントが付き易いです。
退会済みユーザー

退会済みユーザー

2019/09/24 12:43

次回からそうしますアドバイスありがとうございます。
Orlofsky

2019/09/24 13:14

モラルがあるなら、今回から直せた方が良いですよ。 [Oracle]タグを追加すると https://teratail.com/tags/Oracle に載るので同じ疑問を持った人がこの質問を見つけやすくなります。
guest

回答2

0

ベストアンサー

SQLPlus とあるので Oracle でのことと仮定します。

Oracle では TIMESTAMP - TIMESTAMP は INTERVAL になりますので、整数部が日、小数部で時間以下を表現しています(1=24時間=1440分=86400秒)。

ので、結果から類推したとおりで概ね正しいのですが、より確実にするには

SQL

1SELECT 2 PLAYER_LIST.PLAYER_ID, 3 EXTRACT(day FROM (SYSTIMESTAMP-LOGIN_DATE_AND_TIME)) 4...

と、EXTRACT 関数を使ってください。

※ただし、例えば現在時刻=12:00 で最終ログインが前日の19:00 など、期間としては1日未満の場合、0 となるので注意してください

投稿2019/09/18 07:08

tacsheaven

総合スコア13703

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

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

退会済みユーザー

退会済みユーザー

2019/09/24 12:45

しらなかった関数なので勉強になりました。ありがとうございます!
guest

0

経過日数を求めたいという事ですね。

SQL

1SELECT PLAYER_LIST.PLAYER_ID AS プレイヤーID, PLAYER_NAME AS 名前 2 , SYSDATE - TO_DATE(TO_CHAR(LOGIN_DATE_AND_TIME, 'YYYY/MM/DD')) AS 前回ログイン間隔 3FROM PLAYER_LIST

投稿2019/09/18 07:04

sazi

総合スコア25195

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

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

退会済みユーザー

退会済みユーザー

2019/09/24 12:44 編集

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問