sql >> データベース >  >> RDS >> Oracle

OracleSQLで日付関数を操作する方法

    この投稿では、オラクルの日付について、オラクルの日付関数、オラクルの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


    1. SQLServerでGUIを使用して列を変更する方法または変更スクリプトを生成する方法-SQLServer/T-SQLチュートリアルパート38

    2. mysqliの最後の挿入ID

    3. JOINでSQLUPDATEステートメントを使用するための5つの手間のかからないヒント

    4. テーブルが存在する場合、それを削除するにはどうすればよいですか?