この投稿では、オラクルの日付について、オラクルの日付関数、オラクルのSQLの日付形式、オラクルのSQLの日付の比較、年のオラクルの日付の違い、日のオラクルの日付の違い、月のオラクルの日付の違いなど、多くのことを説明しようとしています。
Oracleは、日付と時刻の情報をOracleデータベースに格納するための日付とタイムスタンプのタイプを提供しています。
日付データ型
DATEは、日付と時刻の値を表すことを考えるときによく知っているoracleデータ型です。月、日、
年、世紀、時、分、秒を保存する機能があります。 DATEデータ型の問題は、イベントが互いに1秒以内に発生するときに、2つのイベント間の時間間隔を決定しようとするときの粒度です。この問題は、TIMESTAMPデータ型で解決されています
タイムスタンプ
OracleはDATEデータ型を拡張し、DATEデータ型が格納するすべての情報を格納するTIMESTAMPデータ型を提供しましたが、秒の小数部も含まれています。 DATEデータ型をTIMESTAMPデータ型形式に変換する場合は、CAST関数を使用できます
SQL> SELECT CAST(last_login_date AS TIMESTAMP) "Date" FROM users; Date ----------------------------------------------------- 20-APR-16 01.55.14.000000 PM 21-JUN-16 14.16.36.000000 AM 21-JUL-16 10.16.36.000000 AM 21-SEP-16 11.16.36.000000 AM 21-DEC-16 11.16.36.000000 AM
TIMESTAMPデータ型で返されるシステムの日付と時刻を取得するには、次のようなSYSTIMESTAMP関数を使用できます。
SQL> SELECT SYSTIMESTAMP FROM DUAL; SYSTIMESTAMP --------------------------------------------------------------------------- 01-SEP-19 01.02.17.158913 PM -04:00
いくつかの重要なポイント
1)DATEタイプとTIMESTAMPタイプの両方に、常に日付と時刻のコンポーネントが含まれています。ちょうど真夜中の時刻は00:00:00です。
SELECT TO_CHAR(SYSDATE, 'MM/DD/YYYY HH:MI:SS AM') date_with_time ,TRUNC(SYSDATE) today ,TO_CHAR(TRUNC(SYSDATE), 'MM/DD/YYYY HH:MI:SS AM') date_with_time_midnight FROM dual 2 3 4 ;DATE_WITH_TIME TODAY DATE_WITH_TIME_MIDNIGHT ---------------------- --------- ---------------------- 10/27/2016 11:01:00 AM 27-OCT-16 10/27/2016 12:00:00 AM
2)文字列から日付への暗黙的な変換、または日付から文字列への暗黙の変換に依存しないでください。 TO_CHAR、TO_DATE、およびTO_TIMESTAMP関数を使用して変換を常に明示的に実行するか、ANSI DATEまたはTIMESTAMPリテラルを使用してください。
3)日付またはタイムスタンプの比較を行うときは、常に時間コンポーネントの影響を考慮してください。比較から時間コンポーネントを割り引く場合は、 TRUNCを使用します またはラウンド 比較の両側からそれを削除する機能。
select * from fnd_table where trunc(creation_date) < trunc(sysdate);
4)セッションレベルでnls_date_formatを使用して、必要な日付形式を表示できます
nls_date_formatを使用してOracleの日付形式を変更する
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY MM DD'; select sysdate from dual; ALTER SESSION SET NLS_DATE_FORMAT = 'HH24:MI:SS'; select sysdate from dual; alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'; select sysdate from dual;
5)これが私たちが使用できる時間形式の良い要約です
要素 | 説明 |
日付形式の要素 | |
SCCまたはCC | 世紀; SはBC日付の前に– | を付けます
YYYYまたはSYYYY | 年; SはBC日付の前に– | を付けます
YYYまたはYYまたはY | その年の最後の3、2、または1桁 |
Y、YYY | この位置にカンマが含まれる年 |
IYYY、IYY、IY、I | ISO規格に基づく4、3、2、または1桁の年 |
SYEARまたはYEAR | 年の詳細; SはBC日付の前に– | を付けます
BCまたはAD | BC/ADインジケーター |
B.C。またはA.D. | ピリオド付きのBC/ACインジケーター |
Q | 四半期の年 |
MM | 月、2桁の値 |
月 | 9文字の長さまで空白で埋められた月の名前 |
MON | 月の名前、3文字の略語 |
RM | ローマ数字の月 |
WWまたはW | 年または月の週 |
DDDまたはDDまたはD | 日、月、または週 |
日 | 9文字の長さまで空白で埋められた日の名前 |
DY | その日の名前。 3文字の略語 |
J | ユリウス日;紀元前4713年12月31日からの日数 |
時間形式要素 | |
AMまたはPM | メリディアンインジケーター |
A.M。または午後 | ピリオド付きメリディアンインジケーター |
HHまたはHH12またはHH24 | 時間または時間(1〜12)または時間(0〜23) |
MI | 分(0-59) |
SS | 2番目(0-59) |
SSSSS | 真夜中過ぎの秒数(0-86399) |
サフィックス | |
TH | 序数(つまり、5番目のDDTH) |
SP | スペルアウトされた番号(つまり、FIVEの場合はDDSP) |
SPTHまたはTHSP | スペルアウトされた序数(つまり、FIFTHの場合はDDSPTH) |
その他のフォーマット要素 | |
/、。 | 句読点が結果に再現されます |
「の」 | 引用された文字列が結果に再現されます |
oracle日付関数
前のセクションで、日付とタイムスタンプのデータ型について学習しました。ここで、重要なOracle日付関数とその使用方法について詳しく説明します
ADD_MONTHS
日付関数 | 説明 |
ADD_MONTHS(date、n) | 日付「x」に「n」か月を追加した後の日付値を返します。 |
select ADD_MONTHS ('16-Sep-81', 3) from dual ---------------------------- 16-Dec-81
ADD_MONTHSは、常に日付を1か月ずつシフトします。 month_shiftパラメータに小数値を指定できますが、次の例に示すように、ADD_MONTHSは常にゼロに最も近い整数に切り捨てられます。
だから
select ADD_MONTHS ('28-FEB-2005', 1.5) from dual ------------------------------------------- 31-Mar-2005
負の値も使用できます
select ADD_MONTHS ('28-FEB-2005', -1) from dual ------------------------------ 31-Jan-2005
Last_day
日付関数 | 説明 |
LAST_DAY(x) | 指定された日付「x」から1か月の残り日数を決定するために使用されます。 |
LAST_DAY関数は、指定された日付の月の最終日の日付を返します。この関数は、1か月の日数が年間を通じて変化するため、便利です。
select LAST_DAY ('01-Jun-16') from dual ---------------------------------------------------- 30-Jun-2016
Next_day
日付関数 | 説明 |
NEXT_DAY(x、week_day) | 「x」が発生した日以降の「week_day」の次の日付を返します。 |
NEXT_DAYは、日付より後の日で指定された最初の平日の日付を返します。戻りタイプは、日付のデータ型に関係なく、常にDATEです。引数の日は、セッションの日付言語の曜日である必要があります。フルネームまたは略語のいずれかです
select NEXT_DAY ('01-Jun-08', 'Wednesday') from dual ------------------------------------------- 04-JUN-08
MONTHS_BETWEEN
日付関数 | 説明 |
MONTHS_BETWEEN(x1、x2) | 日付x1とx2の間の月数を返します。 |
MONTHS_BETWEEN関数は、2つの日付の間の月数を計算し、その差を数値として返します
計算のルールは次のとおりです
1)date1がdate2の後に来る場合、MONTHS_BETWEENは正の数を返します。
2)date1がdate2の前にある場合、MONTHS_BETWEENは負の数を返します。
3)date1とdate2の両方が最終日に該当する場合それぞれの月の場合、MONTHS_BETWEENは整数を返します(小数部分は含まれません)。
4)date1とdate2が異なる月にあり、少なくとも1つの日付がその月の最後の日でない場合、MONTHS_BETWEENは小数。小数部分は31日ベースで計算され、date1とdate2の時間要素の違いも考慮されます。
例
select MONTHS_BETWEEN ('29-FEB-2016', '31-MAR-20') from dual -------------------------------------------------------------------------------- -1 select MONTHS_BETWEEN ('31-MAR-1995', '28-FEB-1994') from dual ------------------------------------------------------------------------------- 13 select MONTHS_BETWEEN ('31-JAN-2006', '10-MAR-2006') from dual ---------------------------------------------------------------------------- -1.3225806 SELECT MONTHS_BETWEEN (TO_DATE('02-02-1995','MM-DD-YYYY'), TO_DATE('01-01-1995','MM-DD-YYYY') ) "Months" FROM DUAL; Months ---------- 1.03225806
<マーク>覚えておくべき重要なポイントマーク>
MONTHS_BETWEENは、
各月が31日であると仮定して、月数の分数成分を計算します。したがって、1か月の追加の日ごとに、その月の1/31がカウントされ、
1を31で割った値=.032258065
ラウンド
日付関数 | 説明 |
ROUND(x、date_format) | 「date_format」で指定されている最も近い世紀、年、月、日付、時、分、または秒に四捨五入された日付「x」を返します。 |
ROUND関数は、日付値をフォーマットマスクで指定された最も近い日付に丸めます。これは、日付で機能することを除いて、指定された精度の最も近い数値に数値を丸める標準の数値ROUND関数と同じです。
例
Select ROUND (TO_DATE ('12-MAR-2016'), 'MONTH') from dual; 01-MAR-2016 Select ROUND (TO_DATE ('17-MAR-2016'), 'MONTH') from dual; 01-APR-2016 select ROUND (TO_DATE ('01-MAR-2007'), 'YYYY') from dual; 01-JAN-2007 select ROUND (TO_DATE ('01-SEP-2007'), 'YEAR') from dual; 01-JAN-2008
切り捨て
日付関数 | 説明 |
TRUNC(x、date_format) | 「date_format」で指定された最も近い世紀、年、月、日付、時、分、または秒以下の日付「x」を返します。 |
例
Select TRUNC (TO_DATE ('12-MAR-2016'), 'MONTH') from dual; 01-MAR-2016 Select TRUNC (TO_DATE ('17-MAR-2016'), 'MONTH') from dual; 01-MAR-2016 select TRUNC (TO_DATE ('01-MAR-2007'), 'YYYY') from dual; 01-JAN-2007 select TRUNC (TO_DATE ('01-SEP-2007'), 'YEAR') from dual; 01-JAN-2007
Oracle日付の算術
oracledateデータ型に対して多くの算術演算を実行できます。結果の日付値の日付に数値を加算または減算することができます。 2つの日付を減算して、それらの日付間の日数を求めることができます。時間数を24で割って、現在までの時間を追加します。
足し算と引き算の例
SQL> select sysdate, sysdate+1/24, sysdate +1/1440, sysdate + 1/86400 from dual; SYSDATE SYSDATE+1/24 SYSDATE+1/1440 SYSDATE+1/86400 -------------------- -------------------- -------------------- -------------------- 01-Jul-2016 06:32:12 01-Jul-2016 07:32:12 01-Jul-2016 06:33:12 01-Jul-2016 06:32:13
私たちがそれを使うことができる他の方法は
です説明 | 日付式 |
今 | Sysdate |
明日/翌日 | Sysdate +1 |
7日前 | SYSDATE -7 |
今から1時間 | SYSDATE + 1/24 |
今から3時間 | SYSDATE+3/24またはSYSDATE+1/8 |
今から30分 | SYSDATE + 1/48 |
今から10分 | SYSDATE + 10/1440 |
今から30秒 | SYSDATE + 30/86400 |
それらの間の日数を見つけるための日付の違いに関する算術演算
2つの日付を差し引いて、日付間の日数の差を求めることができます
If the time part is same, then it will always whole number SELECT TO_DATE('25-MAR-2016 11:00:00 AM', 'DD-MON-YYYY HH:MI:SS AM') - TO_DATE('19-MAR-2016 11:00:00 AM', 'DD-MON-YYYY HH:MI:SS AM') diff_in_days FROM dual; DIFF_IN_DAYS ---------- 6 If the time part is not same, then it will always be having fractional components SELECT TO_DATE('25-MAR-2016 10:00:00 AM', 'YYYYMMDD HH:MI:SS AM') - TO_DATE('19-MAR-2016 11:00:00 AM', 'YYYYMMDD HH:MI:SS AM') diff_in_days FROM dual; DIFF_IN_DAYS ---------- 5.95833333 SQL> SELECT TO_DATE('25-MAR-2016 11:00:00 AM', 'YYYYMMDD HH:MI:SS AM') - TO_DATE('19-MAR-2016 10:00:00 AM', 'YYYYMMDD HH:MI:SS AM') diff_in_days FROM dual; DIFF_IN_DAYS ---------- 6.04166666
クエリを使用して、月ごとのOracleの日付の違いを見つけることができます
SELECT MONTHS_BETWEEN (TO_DATE('02-02-1995','MM-DD-YYYY'), TO_DATE('01-01-1995','MM-DD-YYYY') ) "Diff_in_Months", (TO_DATE('02-02-1995','MM-DD-YYYY')- TO_DATE('01-01-1995','MM-DD-YYYY') diff_in_days FROM DUAL;Diff_in_Months diff_in_days ---------------------------------------- 1.03225806 32
クエリを使用して、年単位のOracleの日付の違いを見つけることもできます
SELECT (TO_DATE('20130525', 'YYYYMMDD') - TO_DATE('20100101', 'YYYYMMDD')) diff_in_days , MONTHS_BETWEEN(TO_DATE('20130525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD')) Diff_in_months ,TRUNC(MONTHS_BETWEEN(TO_DATE('20130525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD'))) Diff_in_months_no_fraction, TRUNC(TRUNC(MONTHS_BETWEEN(TO_DATE('20130525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD'))) / 12) Diff_in_years_no_fraction ,MOD(TRUNC(MONTHS_BETWEEN(TO_DATE('20130525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD'))), 12) Diff_in_years_fraction_in_months FROM dual; DIFF_IN_DAYS DIFF_IN_MONTHS DIFF_IN_MONTHS_NO_FRACTION DIFF_IN_YEAR_NO_FRACTION DIFF_IN_YEARS_FRACTION_IN_MONTHS ____________________________________________________________________________________ 1240 40.7741 40 3 4
oracledateデータ型への投稿が気に入っていただければ幸いです。オラクルの日付関数、オラクルのSQLの日付形式、オラクルのSQLの日付の比較、年のオラクルの日付の違い、日数のオラクルの日付の違い、月のオラクルの日付の違いなど、さまざまなことを説明しようとしました。これは完全なガイドではありませんが、OracleSQL開発者に役立つ多くの情報を提示しようとしました
関連記事
SQLクエリの記述方法
OracleSQLチュートリアル:基本的なSQLステートメント
OracleSQLチュートリアル:データセットの制限
SQLの単一行関数
OracleSQLデコード処理
ダウンロードOracleSQL開発者
https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_commands_1029.htm#OLADM780