精华内容
下载资源
问答
  • 有些朋友对ORACLE时间函数理解不是很透彻,接下来讲详细介绍,希望可以帮助到你们
  • 本文讨论了在Amazon RDS和Aurora 中使用PostgreSQL数据库时,与日期/时间相关的函数,并确定PostgreSQL数据库里的clock_timestamp()函数与Oracle中的SYSDATE函数最匹配。同时我们可以自定义基于clock_timestamp()的...

    本文讨论了在Amazon RDS和Aurora 中使用PostgreSQL数据库时,与日期/时间相关的函数,并确定PostgreSQL数据库里的clock_timestamp()函数与Oracle中的SYSDATE函数最匹配。同时我们可以自定义基于clock_timestamp()的改进函数(设置迁移的Oracle数据库服务器时区),具体参考“建议”部分中所述。

    作者:Baji Shaik and Sudip Acharya
    来源:https://aws.amazon.com/cn/blogs/database/converting-the-sysdate-function-from-oracle-to-postgresql/
    译者:多米爸比

    在AWS Cloud 中迁移Oracle数据库到PostgreSQL数据库是一个复杂的过程,从最初评估阶段到迁移转换阶段,多个阶段过程中会涉及不同的技术和技能。有关迁移过程的更多信息,请参阅下面几篇文章:

    • Database Migration—What Do You Need to Know Before You Start?

    • Migration process and infrastructure considerations

    • Source database considerations

    • Target database considerations for the PostgreSQL environment


    Oracle数据库迁移到Amazon RDS或者Amazon Aurora 环境下的PostgreSQL数据库时,最常见的问题之一是SYSDATE函数。应用程序或存储过程以及触发器中最常用的日期/时间函数是SYSDATE。

    建表字段如creation_date,last_updated_date,approved_date,在做更新操作时会被更新为设置的默认值SYSDATE或通过触发器赋值为SYSDATE。


    本文描述了在PostgreSQL数据库里替代Oracle数据库SYSDATE函数的一种方法。

    在评估Oracle和PostgreSQL的日期/时间函数时,要考虑三个方面:

    • Statement级别或者事务级别的影响

    • 客户端时区设置的影响

    • Daylight Saving Time (DST)


    PostgreSQL日期/时间功能概述

    PostgreSQL提供了几个函数,这些函数返回与当前日期和时间有关的值。其中一些功能是SQL标准功能,而其他功能是非SQL标准功能。


    支持的SQL标准函数

    以下是受支持的SQL标准函数:

    • CURRENT_DATE

    • CURRENT_TIMESTAMP/CURRENT_TIMESTAMP(precision)

    • CURRENT_TIME/CURRENT_TIME(precision)

    • LOCALTIME/LOCALTIME(precision)

    • LOCALTIMESTAMP/LOCALTIMESTAMP(precision)

    这些函数返回当前事务的开始时间。如果您在同一事务中多次运行这些函数,则值不会更改。这是一个内部功能特性。如果要在整个事务中使用一致的时间戳,可以使用这些功能。


    CURRENT_DATE

    CURRENT_DATE函数以yyyy-mm-dd格式显示当前日期。请参见以下代码:

    postgres=> select CURRENT_DATE; current_date-------------- 2020-01-03(1 row)
    
    
    

    CURRENT_TIMESTAMP/CURRENT_TIMESTAMP(precision)

    CURRENT_TIME/CURRENT_TIME(precision)

    这些函数返回带时区的当前日期和时间。您可以选择precision参数控制时间精度。此精度舍入小数位数(毫秒)。请参见以下代码:

    postgres=> select CURRENT_TIMESTAMP;       current_timestamp------------------------------- 2020-01-03 04:38:15.662514+00(1 row) postgres=> select CURRENT_TIMESTAMP(2);     current_timestamp--------------------------- 2020-01-03 04:38:19.75+00(1 row) postgres=> select CURRENT_TIME;    current_time-------------------- 04:40:29.409115+00(1 row) postgres=> select CURRENT_TIME(2);  current_time---------------- 04:40:38.01+00(1 row)
    
    
    

    LOCALTIME/LOCALTIME(precision)

    LOCALTIMESTAMP/LOCALTIMESTAMP(precision)

    这些函数返回没有时区的当前日期和时间。您可以选择precision参数控制时间精度。此精度舍入小数位数(毫秒)。请参见以下代码:

    postgres=> select LOCALTIMESTAMP;
           localtimestamp
    ----------------------------
     2020-01-03 04:42:39.405423
    (1 row)
     
    postgres=> select LOCALTIMESTAMP(2);
         localtimestamp
    ------------------------
     2020-01-03 04:42:41.97
    (1 row)
     
    postgres=> select LOCALTIME;
        localtime
    -----------------
     04:42:24.022253
    (1 row)
     
    postgres=> select LOCALTIME(2);
      localtime
    -------------
     04:42:32.01
    (1 row)
    


    支持的非SQL标准函数

    以下是受支持的非SQL标准函数:

    • transaction_timestamp()

    • statement_timestamp()

    • clock_timestamp()

    • timeofday()

    • now()


    PostgreSQL还提供了返回当前语句的开始时间和调用该函数时的实际当前时间的函数。


    transaction_timestamp()和 statement_timestamp()

    transaction_timestamp函数的行为与current_timestamp相同。但是,顾名思义,它返回事务的开始时间,并且在整个事务中保持一致。statement_timestamp函数返回语句的开始时间,与事务无关。


    statement_timestamp()和transaction_timestamp()在事务的第一个命令期间返回相同的值,但在后续命令期间可能有所不同。请参见以下代码:

    postgres=> begin;BEGINpostgres=> select statement_timestamp(), transaction_timestamp();      statement_timestamp      |     transaction_timestamp-------------------------------+------------------------------- 2020-01-03 04:58:39.271915+00 | 2020-01-03 04:58:37.690723+00(1 row) postgres=> select pg_sleep(5); pg_sleep---------- (1 row) postgres=> select statement_timestamp(), transaction_timestamp();      statement_timestamp      |     transaction_timestamp-------------------------------+------------------------------- 2020-01-03 04:58:49.770003+00 | 2020-01-03 04:58:37.690723+00(1 row)
    
    
    

    从上面可以看出transaction_timestamp()两次执行结果值是一样的,statement_timestamp()值发生了改变。


    clock_timestamp()和 statement_timestamp()

    clock_timestamp()函数返回当前时间的真实时间(clock时间),其值在单个SQL命令中动态生成。

    下面的代码示例演示clock_timestamp()在同一命令中返回不同的时间戳值,但statement_timestamp()函数返回相同的值:

    postgres=> WITH time_testpostgres->      AS (SELECT Statement_timestamp())postgres-> SELECT *,postgres->        Pg_sleep(3) AS "<- see the difference ->",postgres->        Statement_timestamp()postgres-> FROM   time_test;      statement_timestamp      | <- see the difference -> |      statement_timestamp-------------------------------+--------------------------+------------------------------- 2020-01-03 05:05:08.458192+00 |                          | 2020-01-03 05:05:08.458192+00(1 row) postgres=>postgres=> WITH time_testpostgres->      AS (SELECT clock_timestamp())postgres-> SELECT *,postgres->        Pg_sleep(3) AS "<- see the difference ->",postgres->        clock_timestamp()postgres-> FROM   time_test;        clock_timestamp        | <- see the difference -> |        clock_timestamp-------------------------------+--------------------------+------------------------------- 2020-01-03 05:05:18.040189+00 |                          | 2020-01-03 05:05:21.042861+00(1 row)
    
    
    

    timeofday() vs clock_timestamp()

    函数timeofday()和clock_timestamp()两者的行为均相同。唯一的区别是timeofday()返回文本数据类型,clock_timestamp()返回带有时区的时间戳。在以下代码示例中的pg_typeof列显示了clock_timestamp()和timeofday()函数的返回类型,分别是时间类型和文本:

    postgres=> select clock_timestamp(), pg_typeof(clock_timestamp()), timeofday(), pg_typeof(timeofday());        clock_timestamp        |        pg_typeof         |              timeofday              | pg_typeof-------------------------------+--------------------------+-------------------------------------+----------- 2020-01-03 05:28:50.203961+00 | timestamp with time zone | Fri Jan 03 05:28:50.203961 2020 UTC | text(1 row)
    
    
    

    now()

    now()函数是PostgreSQL的传统函数,等效于transaction_timestamp()。在下面的代码示例中,两个函数显示相同的时间戳(并且在同一个事务中多次执行,结果值是一样的):

    postgres=> begin;BEGINpostgres=> select now(), transaction_timestamp();              now              |     transaction_timestamp-------------------------------+------------------------------- 2020-01-03 05:29:25.805646+00 | 2020-01-03 05:29:25.805646+00(1 row) postgres=> select pg_sleep(3); pg_sleep---------- (1 row) postgres=> select now(), transaction_timestamp();              now              |     transaction_timestamp-------------------------------+------------------------------- 2020-01-03 05:29:25.805646+00 | 2020-01-03 05:29:25.805646+00(1 row)
    
    
    

    如何选择要使用的PostgreSQL时间函数

    Oracle 的SYSDATE函数返回语句执行时的数据库库服务器日期/时间。因此,在长时间运行的事务中,如果您有多个SYSDATE函数,则每个语句执行都会返回不同的时间。

    在下面的Oracle代码示例中,您可以看到两个不同的SYSDATE函数执行值。在Oracle中SYSDATE函数返回语句的开始时间,与事务开始的时间无关:

    SET SERVEROUTPUT ON ;
    BEGIN
    DBMS_OUTPUT.PUT_LINE('Start : ' || to_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'));
    dbms_lock.sleep(30);
    DBMS_OUTPUT.PUT_LINE('End : ' || to_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'));
    END;
    /
    Start : 2020-01-03 06:11:06
    End : 2020-01-03 06:11:36
    

    在下面的PostgreSQL代码示例中,在一个事务内,您可以按不同的时间间隔捕获不同的PostgreSQL日期和时间函数返回的时间。以下代码在两者之间休眠15秒,比较之前和之后的结果。确定哪个函数提供与以下行为相同的输出值SYSDATE:

    DO$BODY$BEGINRAISE NOTICE 'clock_timestamp()       : %', clock_timestamp();RAISE NOTICE 'statement_timestamp()   : %', statement_timestamp();RAISE NOTICE 'now()                   : %', now();RAISE NOTICE 'current_timestamp       : %', current_timestamp;RAISE NOTICE 'transaction_timestamp() : %', transaction_timestamp();RAISE NOTICE '';RAISE NOTICE 'sleep for 15 secs and see the difference below: %', pg_sleep(15);RAISE NOTICE '';RAISE NOTICE 'clock_timestamp()       : %', clock_timestamp();RAISE NOTICE 'statement_timestamp()   : %', statement_timestamp();RAISE NOTICE 'now()                   : %', now();RAISE NOTICE 'current_timestamp       : %', current_timestamp;RAISE NOTICE 'transaction_timestamp() : %', transaction_timestamp();END;$BODY$;
    
    
    

    上面的代码执行结果如下:

    NOTICE:  clock_timestamp()       : 2020-01-03 06:20:52.3715+00
    NOTICE:  statement_timestamp()   : 2020-01-03 06:20:52.371345+00
    NOTICE:  now()                   : 2020-01-03 06:20:52.371345+00
    NOTICE:  current_timestamp       : 2020-01-03 06:20:52.371345+00
    NOTICE:  transaction_timestamp() : 2020-01-03 06:20:52.371345+00
    NOTICE:
    NOTICE:  sleep for 15 secs and see the difference below:
    NOTICE:
    NOTICE:  clock_timestamp()       : 2020-01-03 06:21:07.438274+00
    NOTICE:  statement_timestamp()   : 2020-01-03 06:20:52.371345+00
    NOTICE:  now()                   : 2020-01-03 06:20:52.371345+00
    NOTICE:  current_timestamp       : 2020-01-03 06:20:52.371345+00
    NOTICE:  transaction_timestamp() : 2020-01-03 06:20:52.371345+00
    

    只有clock_timestamp()函数在单个事务中返回不同的时间信息。因此,最佳匹配替代SYSDATE的PostgreSQL函数是clock_timestamp()。但仅此信息还不够,因为这些值只是时间戳值。由于不同的时区在同一时间点具有不同的时间戳值,因此您还必须考虑时区和DST。否则,您可能会看到与预期不同的值。


    客户端时区设置的影响

    Oracle日期/时间函数(例如SYSDATE()和SYSTIMESTAMP())返回数据库服务器时区的当前日期和时间,而与客户端或会话时区设置无关。但是PostgreSQL日期/时间函数会根据您的客户端或会话时区设置返回时间。在PostgreSQL中,带有时区值的时间戳在UTC内部存储,并在显示给客户端时转换为时区配置参数指定的时区中的本地时间。


    对Oracle的影响

    在Oracle中,SYSDATE对于客户端或会话级时区设置,该功能不起作用。在以下代码示例中,更改时区设置不会影响SYSDATE结果:

    SQL> (select ‘dbtimezone’ as config, dbtimezone as offset from dual) union     (select ‘sessiontimezone’ as config, sessiontimezone as offset from dual); CONFIG OFFSET--------------- ------------------------------dbtimezone      +00:00sessiontimezone +05:30 SQL> select sysdate from dual; SYSDATE
    03/01/2020 09:56:53 SQL> alter session set time_zone = ‘-08:30’;Session altered. SQL> (select ‘dbtimezone’ as config, dbtimezone as offset from dual) union     (select ‘sessiontimezone’ as config, sessiontimezone as offset from dual); CONFIG OFFSET--------------- ------------------------------dbtimezone       +00:00sessiontimezone. -08:30 SQL> select sysdate from dual; SYSDATE
    03/01/2020 09:57.34
    
    

    SYSDATE无论客户端或会话如何设置时区,仍会返回服务器时区的时间戳。


    对PostgreSQL的影响

    在PostgreSQL中,clock_timestamp()和其他时间函数返回客户端会话时区的当前日期和时间。请参见以下代码示例:

    postgres=> show timezone;
     TimeZone
    
    
     UTC
    (1 row)
     
    postgres=> select clock_timestamp();
            clock_timestamp
    
    
     2020-01-03 06:25:36.165378+00
    (1 row)
     
    postgres=> set timezone = ‘America/New_York’;
    SET
    postgres=> show timezone;
         TimeZone
    
    
     America/New_York
    (1 row)
     
    postgres=> select clock_timestamp();
            clock_timestamp
    
    
     2020-01-03 01:25:49.329555-05
    (1 row)
     
    postgres=>
    

    如果这些时间戳是由不同客户端在不同时区返回并存储在TIMESTAMP WITHOUT TIME ZONE类型列中,则数据会产生误导。


    DST注意事项

    Oracle和PostgreSQL数据库之间的时区名称和偏移量实现并不一致。您可能没有从UTC获得匹配的时区名称或时间偏移。另外,PostgreSQL中时区设置的行为取决于您使用完整的时区名称还是时区缩写。PostgreSQL中的时区缩写定义了与UTC的特定偏移量,但是完整的时区名称可能意味着一组DST日期规则。

    系统目录表pg_timezone_names中包含全时区名称的详细信息,pg_timezone_abbrevs表具有时区缩写的详细信息。


    示例:迁移Oracle数据库

    在以下示例中,您必须将Oracle数据库(数据库时区MET)迁移到PostgreSQL数据库,而应用程序代码使用了SYSDATE。在PostgreSQL中,您需要一个类似的时间函数。

    在Oracle中,MET时区支持DST,UTC偏移为+02:00:00。PostgreSQL具有时区名称MET(UTS偏移+02:00:00和DST支持),并且还具有时区缩写MET(UTC偏移+01:00:00和不支持DST)。

    在PostgreSQL数据库中,当您在会话级别或设置AT TIME ZONE时区,如果存在匹配的全名和缩写,则使用缩写。如果将MET设置为timezone DB参数,则偏移量为+01:00:00,并且DST无效。

    以下代码示例关联全时区表和缩写表,过滤显示偏移量不同的值:

    postgres=> select n.name, n.abbrev N_abbrev,a.abbrev, n.utc_offset N_utc_offset ,                 a.utc_offset, n.is_dst N_is_dst, a.is_dst  from pg_timezone_names n, pg_timezone_abbrevs a where n.name = a.abbrev   and n.utc_offset <> a.utc_offset order by 1; name | n_abbrev | abbrev | n_utc_offset | utc_offset | n_is_dst | is_dst------+----------+--------+--------------+------------+----------+--------CET | CEST | CET | 02:00:00 | 01:00:00 | t | fEET | EEST | EET | 03:00:00 | 02:00:00 | t | fMET | MEST | MET | 02:00:00 | 01:00:00 | t | fWET | WEST | WET | 01:00:00 | 00:00:00 | t | f(4 rows) postgres=> show timezone; TimeZone---------- UTC(1 row) postgres=> select clock_timestamp();        clock_timestamp------------------------------- 2020-01-03 06:29:09.672859+00(1 row) postgres=> set session time zone 'MET';SETpostgres=> select clock_timestamp() AT TIME ZONE 'MET';          timezone---------------------------- 2020-01-03 07:29:16.261098(1 row)
    
    
    

    将会话时区设置为MET时,UTC与MET之间的时差为1小时,这是与时区缩写相关的偏移量。另外,此时区不支持DST。您可以使用以下代码手动添加间隔来进行检查:

    postgres=> select clock_timestamp() AT TIME ZONE 'UTC' + interval '02:00:00';          ?column?---------------------------- 2020-01-03 08:29:19.732955(1 row)
    
    
    

    对于MET时区,正确的时区应为Europe / Berlin。请参见以下代码:

    postgres=> select * from pg_timezone_names where lower(name) like '%berlin%';  name          | abbrev | utc_offset | is_dst---------------+--------+------------+-------- Europe/Berlin | CEST   | 02:00:00   | t
    
    
    

    要验证DST是否影响时区,请完成以下步骤:
    查找历史或即将发生的DST更改。有关更多信息,请参见即将进行的夏时制时钟更改。
    在Oracle中,检查DST更改前后UTC偏移量是否更改。
    在PostgreSQL中,检查DTC更改前后UTC偏移是否更改。


    示例:DST更改

    在以下示例中,当本地时钟倒退1小时,MET(中欧时间)的DST更改发生在2018年10月28日上午03:00:00。原始DST UTC偏移应为02:00:00,而新DST UTC偏移应为01:00:00。

    在以下Oracle示例代码中,DST更改时需将时钟延后1小时。

    SQL> ALTER SESSION SET TIME_ZONE='UTC';Session altered. -- Before DST, 28-OCT-2018 at 00:00:00 UTC equivalent to 28-OCT-2018 at 02:00:00 MET SQL> select to_timestamp('2020-01-03 00:00:00','YYYY-MM-DD HH24:MI:SS') at time zone 'MET' from dual; TO_TIMESTAMP('2018-10-2800:00:00','YYYY-MM-DDHH24:MI:SS')ATTIMEZONE'MET'---------------------------------------------------------------------------28-OCT-18 02.00.00.000000000 AM MET -- Before DST, 28-OCT-2018 at 01:00:00 UTC equivalent to 28-OCT-2018 at 02:00:00 MET SQL> select to_timestamp('2018-10-28 01:00:00','YYYY-MM-DD HH24:MI:SS') at time zone 'MET' from dual; TO_TIMESTAMP('2018-10-2801:00:00','YYYY-MM-DDHH24:MI:SS')ATTIMEZONE'MET'---------------------------------------------------------------------------28-OCT-18 02.00.00.000000000 AM MET
    
    
    

    以下代码在PostgreSQL中显示了相同的效果:

    postgres=> show timezone;
    TimeZone
    ----------
    UTC
     
    postgres => select '2018-10-28 00:00:00' AT TIME ZONE 'Europe/Berlin';
    timezone
    ---------------------
    2018-10-28 02:00:00
     
    postgres => select '2018-10-28 01:00:00' AT TIME ZONE 'Europe/Berlin';
    timezone
    ---------------------
    2018-10-28 02:00:00
    

    建议

    考虑到PostgreSQL日期和时间函数不同方面的影响(例如客户端时区设置和DST更改的影响)之后,可以在PostgreSQL中使用如下函数来模拟Oracle的SYSDATE 函数。它提供了一个语句级的时间戳,并不受客户端设置的影响:

    CREATE OR REPLACE FUNCTION <<Your schema>>.sysdate()
    RETURNS TIMESTAMP WITHOUT TIME ZONE
    AS
    $BODY$
        SELECT clock_timestamp() AT TIME ZONE '<<DB Timezone>>';
    $BODY$
    LANGUAGE sql;
    

    在下面的代码示例中,修改客户端时区后也返回一致的结果:

    CREATE OR REPLACE FUNCTION public.sysdate()
    RETURNS TIMESTAMP WITHOUT TIME ZONE
    AS
    $BODY$
       SELECT clock_timestamp() AT TIME ZONE 'Europe/Berlin';
    $BODY$
    LANGUAGE sql;
     
    postgres=> set session time zone 'UTC';
    SET
    postgres=>  select sysdate();
              sysdate
    ----------------------------
     2020-01-03 07:34:54.441904
    (1 row)
     
    postgres=> set session time zone 'Asia/Kolkata';
    SET
    postgres=> select sysdate();
              sysdate
    ----------------------------
     2020-01-03 07:35:02.392743
    (1 row)
    


    墨天轮原文链接:https://www.modb.pro/db/24525(复制到浏览器中打开或者点击“阅读原文”)

    推荐下载:144页!分享珍藏已久的数据库技术年刊

    数据和云

    ID:OraNews

    如有收获,请划至底部,点击“在看”,谢谢!

    点击下图查看更多 ↓

    云和恩墨大讲堂 | 一个分享交流的地方

    长按,识别二维码,加入万人交流社群

    请备注:云和恩墨大讲堂

      点个“在看”

    你的喜欢会被看到❤

    展开全文
  • ORACLE sysdate 操作

    2020-04-16 11:26:01
    @[TOC] ORACLE sysdate 操作 加法 select sysdate,add_months(sysdate,12) from dual; ## 加1年 select sysdate,add_months(sysdate,1) from dual; ## 加1月 select sysdate,to_char(sysdate+7,‘yyyy-mm-dd HH24:MI...

    ORACLE sysdate 操作

    加法

    select sysdate,add_months(sysdate,12) from dual; ## 加1年
    select sysdate,add_months(sysdate,1) from dual; ## 加1月
    select sysdate,to_char(sysdate+7,‘yyyy-mm-dd HH24:MI:SS’) from dual; ## 加1星期
    select sysdate,to_char(sysdate+1,‘yyyy-mm-dd HH24:MI:SS’) from dual; ## 加1天
    select sysdate,to_char(sysdate+1/24,‘yyyy-mm-dd HH24:MI:SS’) from dual; ## 加1小时
    select sysdate,to_char(sysdate+1/24/60,‘yyyy-mm-dd HH24:MI:SS’) from dual; ## 加1分钟
    select sysdate,to_char(sysdate+1/24/60/60,‘yyyy-mm-dd HH24:MI:SS’) from dual; ## 加1秒

    减法

    select sysdate,add_months(sysdate,-12) from dual; ## 减1年
    select sysdate,add_months(sysdate,-1) from dual; ## 减1月
    select sysdate,to_char(sysdate-7,‘yyyy-mm-dd HH24:MI:SS’) from dual; ## 减1星期
    select sysdate,to_char(sysdate-1,‘yyyy-mm-dd HH24:MI:SS’) from dual; ## 减1天
    select sysdate,to_char(sysdate-1/24,‘yyyy-mm-dd HH24:MI:SS’) from dual; ## 减1小时
    select sysdate,to_char(sysdate-1/24/60,‘yyyy-mm-dd HH24:MI:SS’) from dual; ## 减1分钟
    select sysdate,to_char(sysdate-1/24/60/60,‘yyyy-mm-dd HH24:MI:SS’) from dual; ## 减1秒

    举例:

    1、取得当前日期是本月的第几周

    select to_char(sysdate,‘YYYYMMDD W HH24:MI:SS’) from dual;
    select to_char(sysdate,‘W’) from dual;

    2、取得当前日期是一个星期中的第几天,星期日为第一天

    select sysdate,to_char(sysdate,‘D’) from dual;

    类似:

    select to_char(sysdate,‘yyyy’) from dual; ## 年
    select to_char(sysdate,‘Q’ from dual; ## 季
    select to_char(sysdate,‘mm’) from dual; ## 月
    select to_char(sysdate,‘dd’) from dual; ## 日

    ddd 年中的第几天

    WW 年中的第几个星期

    W 该月中第几个星期

    D 周中的星期几

    hh 小时(12)

    hh24 小时(24)

    Mi 分

    ss 秒

    3、取当前日期是星期几,中文显示

    select to_char(sysdate,‘day’) from dual;

    4、如果一个表在一个date类型的字段上面建立了索引,如何使用

    alter session set NLS_DATE_FORMAT=‘YYYY-MM-DD HH24:MI:SS’

    5、得到当前的日期

    select sysdate from dual;

    6、得到当天凌晨0点0分0秒的日期

    select trunc(sysdate) from dual;

    得到这天的最后一秒

    select trunc(sysdate) + 0.99999 from dual;

    得到小时的具体数值

    select trunc(sysdate) + 1/24 from dual;
    select trunc(sysdate) + 7/24 from dual;

    7、得到明天凌晨0点0分0秒的日期

    select trunc(sysdate+1) from dual;
    select trunc(sysdate)+1 from dual;

    8、本月一日的日期

    select trunc(sysdate,‘mm’) from dual;

    9、得到下月一日的日期

    select trunc(add_months(sysdate,1),‘mm’) from dual;

    10、返回当前月的最后一天

    select last_day(sysdate) from dual;
    select last_day(trunc(sysdate)) from dual;
    select trunc(last_day(sysdate)) from dual;
    select trunc(add_months(sysdate,1),‘mm’) - 1 from dual;

    11、得到一年的每一天

    select trunc(sysdate,‘yyyy’)+ rn -1 date0
    from
    (select rownum rn from all_objects
    where rownum<366);

    12、今天是今年的第N天

    SELECT TO_CHAR(SYSDATE,‘DDD’) FROM DUAL;

    13、如何在给现有的日期加上2年

    select add_months(sysdate,24) from dual;

    14、判断某一日子所在年分是否为润年

    select decode(to_char(last_day(trunc(sysdate,‘y’)+31),‘dd’),‘29’,‘闰年’,‘平年’) from dual;

    15、判断两年后是否为润年

    select decode(to_char(last_day(trunc(add_months(sysdate,24),‘y’)+31),‘dd’),‘29’,‘闰年’,‘平年’) from dual;

    16、得到日期的季度

    select ceil(to_number(to_char(sysdate,‘mm’))/3) from dual;
    select to_char(sysdate, ‘Q’) from dual;

    原帖:https://blog.csdn.net/gdkyxy2013/article/details/79693660

    展开全文
  • sysdate.patch

    2021-05-17 16:43:13
    参考博客:PostgreSQL的学习心得和知识总结(二十九)|PostgreSQL数据库兼容Oracle的SYSDATE函数的实现
  • sql 中的sysdate使用

    万次阅读 2019-06-12 17:02:46
    select sysdate,add_months(sysdate,12) from dual; --加1年 select sysdate,add_months(sysdate,1) from dual; --加1月 select sysdate,to_char(sysdate+7,'yyyy-mm-dd HH24:MI:SS') from dual; --加1星期 select ...

    加法
    select sysdate,add_months(sysdate,12) from dual; --加1年
    select sysdate,add_months(sysdate,1) from dual; --加1月
    select sysdate,to_char(sysdate+7,'yyyy-mm-dd HH24:MI:SS') from dual; --加1星期
    select sysdate,to_char(sysdate+1,'yyyy-mm-dd HH24:MI:SS') from dual; --加1天
    select sysdate,to_char(sysdate+1/24,'yyyy-mm-dd HH24:MI:SS') from dual; --加1小时
    select sysdate,to_char(sysdate+1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual; --加1分钟
    select sysdate,to_char(sysdate+1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual; --加1秒

    减法
    select sysdate,add_months(sysdate,-12) from dual; --减1年
    select sysdate,add_months(sysdate,-1) from dual; --减1月
    select sysdate,to_char(sysdate-7,'yyyy-mm-dd HH24:MI:SS') from dual; --减1星期
    select sysdate,to_char(sysdate-1,'yyyy-mm-dd HH24:MI:SS') from dual; --减1天
    select sysdate,to_char(sysdate-1/24,'yyyy-mm-dd HH24:MI:SS') from dual; --减1小时
    select sysdate,to_char(sysdate-1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual; --减1分钟
    select sysdate,to_char(sysdate-1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual; --减1秒

    ORACLE时间函数(SYSDATE)简析
    1:取得当前日期是本月的第几周
    SQL> select to_char(sysdate,'YYYYMMDD W HH24:MI:SS') from dual;
    TO_CHAR(SYSDATE,'YY
    -------------------
    20030327 4 18:16:09
    SQL> select to_char(sysdate,'W') from dual;
    T
    -
    4
    2:取得当前日期是一个星期中的第几天,注意星期日是第一天
    SQL> select sysdate,to_char(sysdate,'D') from dual;
    SYSDATE T
    --------- -
    27-MAR-03 5
      类似:
    select to_char(sysdate,'yyyy') from dual; --年
    select to_char(sysdate,'Q' from dual; --季
    select to_char(sysdate,'mm') from dual; --月
    select to_char(sysdate,'dd') from dual; --日
    ddd 年中的第几天
    WW 年中的第几个星期
    W 该月中第几个星期
    D 周中的星期几
    hh 小时(12)
    hh24 小时(24)
    Mi 分
    ss 秒
    3:取当前日期是星期几中文显示:
    SQL> select to_char(sysdate,'day') from dual;
    TO_CHAR(SYSDATE,'DAY')
    ----------------------

    星期四
    4:如果一个表在一个date类型的字段上面建立了索引,如何使用
    alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'

    5: 得到当前的日期
    select sysdate from dual;
    6: 得到当天凌晨0点0分0秒的日期
    select trunc(sysdate) from dual;
    -- 得到这天的最后一秒
    select trunc(sysdate) + 0.99999 from dual;
    -- 得到小时的具体数值
    select trunc(sysdate) + 1/24 from dual;
    select trunc(sysdate) + 7/24 from dual;
    7.得到明天凌晨0点0分0秒的日期
    select trunc(sysdate+1) from dual;
    select trunc(sysdate)+1 from dual;
    8: 本月一日的日期
    select trunc(sysdate,'mm') from dual;
    9:得到下月一日的日期
    select trunc(add_months(sysdate,1),'mm') from dual;

    10:返回当前月的最后一天?
    select last_day(sysdate) from dual;
    select last_day(trunc(sysdate)) from dual;
    select trunc(last_day(sysdate)) from dual;
    select trunc(add_months(sysdate,1),'mm') - 1 from dual;
    11: 得到一年的每一天
    select trunc(sysdate,'yyyy')+ rn -1 date0
    from
    (select rownum rn from all_objects
    where rownum<366);
    12:今天是今年的第N天
    SELECT TO_CHAR(SYSDATE,'DDD') FROM DUAL;
    13:如何在给现有的日期加上2年
    select add_months(sysdate,24) from dual;
    14:判断某一日子所在年分是否为润年
    select decode(to_char(last_day(trunc(sysdate,'y')+31),'dd'),'29','闰年','平年') from dual;
    15:判断两年后是否为润年
    select decode(to_char(last_day(trunc(add_months(sysdate,24),'y')+31),'dd'),'29','闰年','平年') from dual;
    16:得到日期的季度
    select ceil(to_number(to_char(sysdate,'mm'))/3) from dual;
    select to_char(sysdate, 'Q') from dual;

    展开全文
  • select sysdate,add_months(sysdate,12) from dual;--加1年 select sysdate,add_months(sysdate,1) from dual;--加1月 select sysdate,to_char(sysdate+7,'yyyy-mm-dd HH24:MI:SS') from dual;--加1星期 select ...

    加法 

     select sysdate,add_months(sysdate,12) from dual;        --加1年

     select sysdate,add_months(sysdate,1) from dual;        --加1月

     select sysdate,to_char(sysdate+7,'yyyy-mm-dd HH24:MI:SS') from dual;   --加1星期

     select sysdate,to_char(sysdate+1,'yyyy-mm-dd HH24:MI:SS') from dual;   --加1天

     select sysdate,to_char(sysdate+1/24,'yyyy-mm-dd HH24:MI:SS') from dual;  --加1小时

     select sysdate,to_char(sysdate+1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual;  --加1分钟

     select sysdate,to_char(sysdate+1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual;  --加1秒

    减法

     select sysdate,add_months(sysdate,-12) from dual;        --减1年

     select sysdate,add_months(sysdate,-1) from dual;        --减1月

     select sysdate,to_char(sysdate-7,'yyyy-mm-dd HH24:MI:SS') from dual;   --减1星期

     select sysdate,to_char(sysdate-1,'yyyy-mm-dd HH24:MI:SS') from dual;   --减1天

     select sysdate,to_char(sysdate-1/24,'yyyy-mm-dd HH24:MI:SS') from dual;  --减1小时

     select sysdate,to_char(sysdate-1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual;  --减1分钟

     select sysdate,to_char(sysdate-1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual;  --减1秒

    展开全文
  • Oracle sysdate加减

    2021-08-11 09:27:29
    SQL Language Reference:SYSDATE sysdate 返回数据库服务器所在操作系统的当前日期和时间。返回的数据类型是DATE类型,返回的格式取决于NLS_DATE_FORMAT这个初始化参数。这个函数不需要参数。在发行的SQL声明中,...
  • Oracle日期常用函数(SYSDATE

    万次阅读 多人点赞 2018-03-26 09:57:28
    SYSDATE函数可以得到目前系统的时间,例如:select sysdate from dual;SYSDATE函数常用的格式举例如下:--加法 select sysdate,add_months(sysdate,12) from dual; --加1年 select sysdate,add_months(sysdate,1) ...
  • sysdate

    2012-12-06 17:38:00
    30分钟:sysdate+1/481个小时:sysdate+1/24一天:sysdate+1一个星期: sysdate+7每个星期五中午:NEXT_DAY(TRUNC(SYSDATE),'星期五') + 12/24一个月:add_months(sysdate,1) --可以为正负数一年:add_months(sysdate,...
  • Oracle数据库之sysdate

    2020-07-15 15:35:51
    a select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss,www') from dual -- 2018-07-18 15:38:04,293 后三位可用的字母包含q/w/y/i/d/m...select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss,yyj') from dual --20...
  • sysdate()简单用法

    千次阅读 2018-10-09 23:39:00
    select '当前系统日期:'||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),'本月第'||to_char(sysdate,'w')||'周' from rq   获取当前日期是一个星期中的第几天: 注意:星期日是第一天 日期是星期几中文显示...
  • 客户的生产环境为一套两节点RAC,数据库版本为11.2.0.4,运行在centos6.9虚拟机中,现在发现下面客户端连接到数据库的时候,当会话连接在节点1上的时候,查询的sysdate时间不对,比正常时间晚了13个小时,而当会话连接到...
  • MySQL sysdate()函数

    万次阅读 2018-09-08 11:52:26
    转载自 MySQL sysdate()函数 MySQL SYSDATE函数介绍 下面说明了SYSDATE()函数的语法: SYSDATE(fsp); 如果函数用于字符串上下文或YYYYMMDDHHMMSS格式,则SYSDATE()函数将返回当前日期时间,格式为“YYYY-MM-...
  • Oracle sysdate时间加减

    千次阅读 2018-02-08 23:12:40
    加法 select sysdate,add_months(sysdate,12) from dual; --加1年 select sysdate,add_months(sysdate,1) from dual; --加1月 select sysdate,to_char(sysdate+7,'yyyy-mm-dd HH24:MI:SS') from dual; --加1
  • col SYSDATE for a20 col SYSTIMESTAMP for a40 col CURRENT_DATE for a20 col CURRENT_TIMESTAMP for a40 select sysdate,systimestamp,current_date,current_timestamp from dual; SQL> select sysdate,...
  • ORACLE时间函数(SYSDATE)简单理解

    千次阅读 2016-10-26 17:22:51
    select sysdate,add_months(sysdate,12) from dual; --加1年  select sysdate,add_months(sysdate,1) from dual; --加1月  select sysdate,to_char(sysdate+7,'yyyy-mm-dd HH24:MI:SS') from dual; --加1星期  ...
  • MySQL SYSDATE函数介绍 下面说明了SYSDATE()函数的语法: SYSDATE(fsp); 如果函数用于字符串上下文或YYYYMMDDHHMMSS格式,则SYSDATE()函数将返回当前日期时间,格式为“YYYY-MM-DD HH:MM:SS”的值,以防在函数...
  • now()和sysdate()

    千次阅读 2020-01-16 15:26:46
    mysql获取当前时间的方式有 curdate():获取年月日 curtime():获取时分秒 now():获取年 月 日 时 分 秒 sysdate():获取年 月 日 时 分 秒 ... 那么 now()和sysdate()都是获取当前时间 ... sysdate()获取的不仅是s...
  • sql用法-sysdate()

    2021-01-07 10:22:31
    https://www.yiibai.com/mysql/sysdate.html
  • Oracle中sysdate的加减法

    2019-07-24 12:21:05
    加法和减法是相同的,这里只...select sysdate, add_months(sysdate, 12) from dual; --加1年 select sysdate, add_months(sysdate, 1) from dual; --加1月 select sysdate, to_char(sysdate + 1, 'yyyy-mm-dd hh...
  • 说说 Oracle 的 SYSDATE 函数

    千次阅读 2019-12-17 18:52:01
    SYSDATE 函数会返回数据库所在操作系统所设置的当前日期和时间。返回值的数据类型为 DATE ,返回的格式取决于 NLS_ DATE _FORMAT 初始化参数的值。该函数不需要参数。并且在分布式 SQL 语句中,此函数返回的是本地...
  • SYSDATE函数可以得到目前系统的时间, 例如:select sysdate from dual; SYSDATE函数常用的格式举例如下:  --加法相关  select sysdate,add_months(sysdate,12) from dual; --加1年  select sysdate,add_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 91,259
精华内容 36,503
关键字:

sysdate