GaussDB-GaussDB-时间和日期处理函数和操作符(下)

371 阅读40分钟

GaussDB-GaussDB-时间和日期处理函数和操作符(下)

  • curdate()

    描述:返回本地函数调用开始时刻的系统日期。支持在同一连接内修改时区,返回的日期受时区影响。

    返回值类型:date

    示例:

    | ``` gaussdb=# SELECT curdate(); curdate ------------ 2023-08-10 (1 row)

    | ---------------------------------------------------------------------------------- |
    
    ![](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/5382f29d5dd5444f897371eaaf5623b2~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402394&x-signature=sGYm0Wdlf2UzmtZB7nBo3uLHNvw%3D)
    
    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。
    
    
  • curtime([precision])

    描述:返回SQL调用开始时刻的系统时间。

    参数:表示精度(秒后小数的位数),int类型,范围为[0,6],缺省时默认值为0,能转成范围内整型值可以输出对应精度时间值,其他无效值会报错。

    返回值类型:time without time zone

    实现方式:注册系统函数curtime。

    示例:

    | ``` gaussdb=# SELECT curtime(3); curtime -------------- 16:59:57.203 (1 row)

    | ----------------------------------------------------------------------------------------- |
    
    ![](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/6052847b22b84a5aba79e230d3f7dc25~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402394&x-signature=jLPFC6qYS9fN%2BbJ0n99A9R7gODo%3D)
    
    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。
    
    
  • date_add(date,INTERVAL val unit)

    描述:向指定日期添加一段时间,并返回计算结果。

    参数:参数介绍如表5所示。

    参数类型描述取值范围
    date时间类型表达式、text、datetime、date或time等类型要加上时间间隔的日期。和类型范围一致。
    val整数、浮点数、字符串等类型要加上的时间间隔。和类型范围一致。
    unit关键字时间间隔的单位。YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND、MICROSECOND等,具体请参见时间间隔表达式

    返回值类型:单个返回值,具体返回类型描述如表6所示。

    返回值类型描述
    TEXT当date入参为text类型。
    DATE当date入参为date类型,且unit入参大于等于day(如week、month)。
    TIME WITHOUT TIMEZONE当date入参为time类型。
    DATETIME当date入参为datetime类型;或当date入参为date类型,且unit入参小于day(如hour、second)。

    示例:

    gaussdb=#  SELECT DATE_ADD('2018-05-01', INTERVAL 1 DAY);
      date_add  
    ------------
     2018-05-02
    (1 row)
    

    1. 该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。
    2. 在prepare语句中,date_add的第二个参数为interval表达式,不支持使用参数1替代使用,例如:preparep1asselectdateadd(2023010110:00:00,1替代使用,例如:prepare p1 as select date_add('2023-01-01 10:00:00', 1);
  • date_add(expr, days)

    描述:将日期加上一定的天数值,返回一个新的日期。

    参数:

    • expr:指定开始的日期时间,时间类型表达式,TEXT、DATE、DATETIME或TIME等类型。
    • days:需要加上的天数,int类型。

    返回值类型:TEXT、DATE、DATETIME或TIME WITHOUT TIMEZONE

    示例:

    gaussdb=# SELECT DATE_ADD('2018-05-01', 1);
      date_add  
    ------------
     2018-05-02
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • date_format(date, format)

    描述:将日期时间以指定格式输出。

    参数:参数介绍如表7所示。

    参数类型描述取值范围
    date时间类型表达式、TEXT、DATETIME、DATE或TIME等类型需要格式化的日期。和类型范围一致。
    formattext格式化字符串。请参见表8

    format参数列表如表8所示。

    format取值含义
    %a星期的缩写(Sun..Sat)。
    %b月份的缩写(Jan..Dec)。
    %c月份数字(0..12)。
    %D带有英语前缀的月份中的每天(0th, 1st, 2nd, 3rd, …)。
    %d月份中的每天的两位数字表示(00..31)。
    %e月份中的每天的数字表示(0..31)。
    %f微秒(000000..999999)。
    %H小时(00..23)。
    %h小时(01..12)。
    %I小时(01..12)。
    %i分钟(00..59)。
    %j一年中的每天(001..366)。
    %k小时(0..23)。
    %l小时(1..12)。
    %M月份名称(January..December)。
    %m两位数字月份(00..12)。
    %pAM或者PM。
    %r十二小时制时间(hh:mm:ss后跟AM或PM)。
    %S秒(00..59)。
    %s秒(00..59)。
    %T二十四小时制时间(hh:mm:ss)。
    %U一年中的星期(00..53),每周的开始是星期天。
    %u一年中的星期(00..53),每周的开始是星期一。
    %V一年中的星期(01..53),每周的开始是星期天。
    %v一年中的星期(01..53),每周的开始是星期一。
    %W星期的名称(Sunday..Saturday)。
    %w星期中的每天(0=星期天..6=星期六)。
    %X一年中的星期,每周的开始是星期天,四位数字,用于%V。
    %x一年中的星期,每周的开始是星期一,四位数字,用于%v。
    %Y四位数字年份。
    %y两位数字年份。

    返回值类型:text

    示例:

    gaussdb=# SELECT date_format('2023-10-11 12:13:14.151617','%b %c %M %m');    
         date_format    
    -------------------
     Oct 10 October 10
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • date_sub(date, INTERVAL val unit)

    描述:将日期减上一定的时间间隔,返回一个新的日期。

    参数:参数介绍如表9所示。

    参数类型描述取值范围
    date时间类型表达式、text、datetime、date或time等类型要加上时间间隔的日期。和类型范围一致。
    val整数、浮点数、字符串等类型要加上的时间间隔。和类型范围一致。
    unit关键字时间间隔的单位。YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND、MICROSECOND等,具体请参见时间间隔表达式

    返回值类型:TEXT、DATE、DATETIME或TIME WITHOUT TIMEZONE。

    示例:

    gaussdb=#  SELECT DATE_SUB('2018-05-01', INTERVAL 1 YEAR);
      date_sub  
    ------------
     2017-05-01
    (1 row)
    

    1. 该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。
    2. 在prepare语句中,date_sub的第二个参数为interval表达式,不支持使用参数1替代使用,例如:preparep1asselectdatesub(2023010110:00:00,1替代使用,例如:prepare p1 as select date_sub('2023-01-01 10:00:00', 1);
  • date_sub(expr, days)

    描述:指定开始的日期时间和要从开始的日期时间减去的天数值,返回相减后的日期结果值。

    参数:

    • expr:指定开始的日期时间,时间类型表达式,TEXT、DATE、DATETIME或TIME等类型。
    • days:需要减去的天数,int类型。

    返回值类型:TEXT、DATE、DATETIME或TIME WITHOUT TIMEZONE。

    示例:

    gaussdb=#  SELECT DATE_SUB('2023-1-1', 20);
      date_sub  
    ------------
     2022-12-12
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • datediff(expr1, expr2)

    描述:返回两个时间表达式之间相差的天数。

    参数:时间类型表达式、text、datetime、date或time等类型。

    返回值类型:int

    示例:

    gaussdb=#  SELECT datediff('2021-11-12','2021-11-13');
     datediff 
    ----------
           -1
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • day()/dayofmonth()

    描述:提取日期时间的天数部分,将结果返回。dayofmonth()是day()的别名,功能完全相同。

    参数:入参为指定提取的日期时间,是时间类型表达式、text、datetime、date或time等类型。

    返回值类型:int

    示例:

    gaussdb=# SELECT day('2023-01-02');
     day 
    -----
       2
    (1 row)
    gaussdb=# SELECT dayofmonth('23-05-22');
     dayofmonth 
    ------------
             22
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • dayname()

    描述:返回日期的星期几名称。

    参数:入参为时间类型表达式、TEXT、DATETIME、DATE或TIME等类型。

    返回值类型:text

    示例:

    gaussdb=# SELECT dayname('2023-10-11');
      dayname  
    -----------
     Wednesday
    (1 row)
    

    • 该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。
    • 返回值使用的语言由GUC参数lc_time_names控制。
  • dayofweek()

    描述:返回日期的工作日索引(1=周日,2=周一,…,7=周六)。

    参数:时间类型表达式、text、datetime、date或time等类型。

    返回值类型:bigint

    示例:

    gaussdb=# SELECT dayofweek('2023-04-16');
     dayofweek 
    -----------
             1
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • dayofyear()

    描述:返回一年中的第几天。

    参数:入参为时间类型表达式、TEXT、DATETIME、DATE或TIME等类型。

    返回值类型:int,范围1-366。

    示例:

    gaussdb=# SELECT dayofyear('2000-12-31');
     dayofyear 
    -----------
           366
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • extract(unit FROM date)

    描述:提取时间的一部分 ,此函数在其他模式可以使用,但行为差异较大。当sql_compatibility = 'MYSQL'时,设置参数b_format_version = '5.7'和参数b_format_dev_version = 's1'时该函数的表现如下所述。

    参数:

    • unit:text。具体的取值类型如表10所示。
    • date:date/time/datetime/text等时间类型表达式。

    返回值类型:bigint

    UNIT 取值含义
    MICROSECOND微秒
    SECOND
    MINUTE分钟
    HOUR小时
    DAY天数
    WEEK周数
    MONTH月份
    QUARTER季度
    YEAR年份
    SECOND_MICROSECOND秒、微秒的拼接值
    MINUTE_MICROSECOND分钟、秒、微秒的拼接值
    MINUTE_SECOND分钟、秒的拼接值
    HOUR_MICROSECOND小时、分钟、秒、微秒的拼接值
    HOUR_SECOND小时、分钟、秒的拼接值
    HOUR_MINUTE小时、分钟的拼接值
    DAY_MICROSECOND天数、小时、分钟、秒、微秒的拼接值
    DAY_SECOND天数、小时、分钟、秒的拼接值
    DAY_MINUTE天数、分钟的拼接值
    DAY_HOUR天数、小时的拼接值
    YEAR_MONTH年份、月份的拼接值
    EPOCH表示自1970-01-01 00:00:00-00 UTC以来的秒数或时间间隔的总秒数

    示例:

    gaussdb=# SELECT extract(YEAR FROM '2023-10-11');
     extract 
    ---------
        2023
    (1 row)
     
    gaussdb=# SELECT extract(QUARTER FROM '2023-10-11');
     extract 
    ---------
           4
    (1 row)
     
    gaussdb=# SELECT extract(MONTH FROM '2023-10-11');
     extract 
    ---------
          10
    (1 row)
     
    gaussdb=# SELECT extract(WEEK FROM '2023-10-11');
     extract 
    ---------
          41
    (1 row)
     
    gaussdb=# SELECT extract(DAY FROM '2023-10-11');
     extract 
    ---------
          11
    (1 row)
     
    gaussdb=# SELECT extract(HOUR FROM '2023-10-11 12:13:14');
     extract 
    ---------
          12
    (1 row)
    

    extract在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时,调用的函数实际上注册为b_extract,在其他情况中,实际注册的函数为date_part,可以用“\df b_extract”等指令查询函数详细入参与返回值。

    GUC参数default_week_format用于处理特殊周问题,默认值为0。详细描述如表11所示。

    default_week_format一周的第一天范围哪一周是第一周
    0周日0~53今年有周日的周。
    1周一0~53今年有4天及以上的周。
    2周日1~53今年有周日的周。
    3周一1~53今年有4天及以上的周。
    4周日0~53今年有4天及以上的周。
    5周一0~53今年有周一的周。
    6周日1~53今年有4天及以上的周。
    7周一1~53今年有周一的周。
  • from_days(days)

    描述:给定一个天数,返回相应的日期值。

    参数:入参为时间类型表达式、TEXT、DATETIME、DATE或TIME等类型。

    返回值类型:date

    示例:

    gaussdb=# SELECT from_days(36524);--0099-12-31
     from_days  
    ------------
     0099-12-31
    (1 row)
    

    • 该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。
    • 对于空字符和0字符,将作为0处理;对于无法正确转换为bigint的入参,将报错。
    • 入参小于366时,返回日期为0000-00-00。
  • from_unixtime(unix_timestamp[,format])

    描述:将Unix时间戳转换为日期时间格式的函数。Unix时间戳是指从1970年1月1日08:00:00 UTC到指定时间的秒数。

    参数:

    • unix_timestamp:unix时间戳,numeric类型。
    • format:时间格式,text类型。

    返回值类型:text/datetime

    示例:

    gaussdb=# SELECT from_unixtime(1111885200);
        from_unixtime    
    ---------------------
     2005-03-27 09:00:00
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • get_format({DATE | TIME | DATETIME | TIMESTAMP}, {'EUR' | 'USA' | 'JIS' | 'ISO' | 'INTERNAL'})

    描述:将日期或时间或datetime转换为指定格式的时间格式字符串,即不同地区的“年月日 时分秒”格式和排序标准。

    参数:

    • DATE|TIME|DATETIME|TIMESTAMP:表示时间类型,为关键字
    • 'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL':五种时间格式,text类型。

    返回值类型:text

    示例:

    gaussdb=# SELECT get_format(date, 'eur');
     get_format 
    ------------
     %d.%m.%y
    (1 row)
    gaussdb=# SELECT get_format(date, 'usa');
     get_format 
    ------------
     %m.%d.%y
    (1 row)
    

    1. 该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。
    2. 在prepare语句中,get_format的第一个参数为关键字,不支持使用参数1替代使用,例如:preparep1asselectgetformat(1替代使用,例如:prepare p1 as select get_format(1, 'usa');
  • hour()

    描述:输入一个时间类型,返回对应的时间的小时部分。

    参数:时间类型表达式、text、datetime、date或time等类型。

    返回值类型:bigint

    示例:

    gaussdb=# SELECT HOUR('10:10:10.1');
     hour 
    ------
       10
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • makedate(year,dayofyear)

    描述:根据年份和天数值返回日期。

    参数:

    • year:bigint。
    • dayofyear:bigint,该年的第若干天,允许跨年,小于等于0时返回null。

    返回值类型:date

    示例:

    gaussdb=# SELECT makedate(2000, 60);
      makedate  
    ------------
     2000-02-29
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • microsecond()

    描述:输入一个时间类型,返回对应的时间的微秒部分。

    参数:时间类型表达式、text、datetime、date或time等类型。

    返回值类型:bigint

    示例:

    gaussdb=# SELECT MICROSECOND('2023-5-5 10:10:10.24485');
     microsecond 
    -------------
          244850
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • minute()

    描述:输入一个时间类型,返回对应的时间的分钟部分。

    参数:时间类型表达式、text、datetime、date或time等类型。

    返回值类型:bigint

    示例:

    gaussdb=# SELECT MINUTE(time'10:10:10');
     minute 
    --------
         10
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • month()

    描述:返回从过去日期开始的月份。

    参数:入参为指定提取的日期时间,是时间类型表达式、TEXT、DATETIME、DATE或TIME等类型。

    返回值类型:int

    示例:

    gaussdb=# SELECT month('2021-11-30');
     month 
    -------
        11
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • monthname()

    描述:返回日期的月份全名。

    参数:入参为时间类型表达式、TEXT、DATETIME、DATE或TIME等类型。

    返回值类型:text

    示例:

    gaussdb=# SELECT monthname('2023-02-28');
     monthname 
    -----------
     February
    (1 row)
    

    • 该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。
    • 返回值使用的语言由lc_time_names系统变量的值控制。
  • period_add(period, month_number)

    描述:在指定时间段上加上指定的月数,将结果作为时间段返回。

    参数:

    • period:bigint,使用YYYYMM或YYMM格式表示的日期。
    • month_number:bigint,需要加上的月数,允许为负数。

    返回值类型:bigint,使用YYYYMM格式表示的日期。

    示例:

    gaussdb=# SELECT period_add(202205, -12);
     period_add 
    ------------
         202105
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • period_diff(p1,p2)

    描述:计算两个时间的月份差。

    参数:P1,P2均为YYMM或YYYYMM格式的期间,bigint类型。

    返回值类型:bigint,月份差。

    示例:

    gaussdb=# SELECT period_diff('202101', '202102'); 
     period_diff 
    -------------
              -1
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • second()

    描述:输入一个时间类型,返回对应的时间的秒部分。

    参数:时间类型表达式、text、datetime、date或time等类型。

    返回值类型:bigint

    示例:

    gaussdb=# SELECT SECOND('2023-5-5 10:10:10');
     second 
    --------
         10
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • quarter()

    描述:输入一个日期类型,返回对应的日期的季度部分。

    参数:入参为指定提取的日期时间,是时间类型表达式、TEXT、DATETIME、DATE或TIME等类型。

    返回值类型:bigint

    示例:

    gaussdb=# SELECT QUARTER('2012-1-1');
     quarter 
    ---------
           1
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • str_to_date(str, format)

    描述:将指定的字符串根据指定日期格式转为日期/时间。

    参数:

    • str:text类型,需要格式化成日期的字符串; format:text类型,格式化字符串。

    • format参数列表如表12所示。

      format取值含义
      %a星期的缩写(Sun..Sat)。
      %b月份的缩写(Jan..Dec)。
      %c月份数字(0..12)。
      %D带有英语前缀的月份中的每天(0th, 1st, 2nd, 3rd, …)。
      %d月份中的每天的两位数字表示(00..31)。
      %e月份中的每天的数字表示(0..31)。
      %f微秒(000000..999999)。
      %H小时(00..23)。
      %h小时(01..12)。
      %I小时(01..12)。
      %i分钟(00..59)。
      %j一年中的每天(001..366)。
      %k小时(0..23)。
      %l小时(1..12)。
      %M月份名称(January..December)。
      %m两位数字月份(00..12)。
      %pAM或者PM。
      %r十二小时制时间(hh:mm:ss后跟AM或PM)。
      %S秒(00..59)。
      %s秒(00..59)。
      %T二十四小时制时间(hh:mm:ss)。
      %U一年中的星期(00..53),每周的开始是星期天。
      %u一年中的星期(00..53),每周的开始是星期一。
      %V一年中的星期(01..53),每周的开始是星期天。
      %v一年中的星期(01..53),每周的开始是星期一。
      %W星期的名称(Sunday..Saturday)。
      %w星期中的每天(0=星期天..6=星期六)。
      %X一年中的星期,每周的开始是星期天,四位数字,用于%V。
      %x一年中的星期,每周的开始是星期一,四位数字,用于%v。
      %Y四位数字年份。
      %y两位数字年份。

    返回值类型:text

    示例:

    gaussdb=# SELECT str_to_date('May 1, 2013','%M %d,%Y');--2013-05-01
     str_to_date 
    -------------
     2013-05-01
    (1 row)
    

    • 该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。
    • 只支持返回YYYY-MM-DD格式的时间。
    • 对于包含0年0月0日的时间或者只包含时分秒的时间,会报警并返回NULL。
  • subdate(expr, days)

    描述:指定开始的日期时间和要从开始的日期时间减去的天数值,返回相减后的日期结果值。

    参数:

    • expr:指定开始的日期时间,时间类型表达式,TEXT、DATE、DATETIME或TIME等类型。
    • days:需要减去的天数,int类型。

    返回值类型:TEXT、DATE、DATETIME或TIME WITHOUT TIMEZONE。

    示例:

    gaussdb=# SELECT SUBDATE('2023-1-1', 20);
      subdate   
    ------------
     2022-12-12
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • subdate(expr,INTERVAL val unit)

    描述:指定开始的日期时间和要从开始的日期时间减去的时间间隔,返回相减后的日期结果值。

    参数:参数介绍如表13所示。

    参数类型描述取值范围
    expr时间类型表达式、text、datetime、date或time等类型指定开始的日期时间。和类型范围一致。
    val整数、浮点数、字符串等类型指定要减去的时间间隔。和类型范围一致。
    unit关键字YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND、MICROSECOND等,具体请参见时间间隔表达式

    返回值类型:TEXT、DATE、DATETIME或TIME WITHOUT TIMEZONE。

    示例:

    gaussdb=# SELECT SUBDATE('2018-05-01', INTERVAL 1 YEAR);
      subdate   
    ------------
     2017-05-01
    (1 row)
    

    1. 该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。
    2. 在prepare语句中,subdate的第二个参数为interval表达式,当使用参数1完全替代时,会导致结果非预期,例如:preparep1asselectsubdate(2023010110:00:00,1完全替代时,会导致结果非预期,例如:prepare p1 as select subdate('2023-01-01 10:00:00', 1); execute p1(interval 13 hour);该用例返回非预期结果为'2023-01-01 10:00:00'。
  • subtime(expr1,expr2)

    描述:返回时间或时间日期表达式expr1与时间表达式expr2的差值。

    参数:

    • expr1为TIMESTAMP WITHOUT TIME ZONE/TIME类型的表达式,expr2为TIME表达式。
    • 返回值类型与expr1类型有关,两入参存在TEXT类型则返回TEXT,解析为TIMESTAMP WITHOUT TIME ZONE则返回TIMESTAMP WITHOUT TIME ZONE,解析为TIME则返回TIME。

    返回值类型:TEXT、TIMESTAMP WITHOUT TIME ZONE或TIME

    示例:

    gaussdb=# SELECT subtime('2000-03-01 20:59:59', '22:58');
           subtime       
    ---------------------
     2000-02-29 22:01:59
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • addtime(expr1,expr2)

    描述:返回时间或时间日期表达式expr1与时间表达式expr2的相加后的值,返回值的格式与expr1保持一致。

    参数:

    • expr1为timestamp without time zone/time类型的表达式,expr2为time表达式。
    • 返回值类型与expr1类型有关,解析为timestamp without time zone则返回timestamp without time zone,解析为time则返回time。

    返回值类型:text、timestamp without time zone或time

    示例:

    gaussdb=# SELECT addtime('2000-03-01 20:59:59', '00:00:01');
           addtime       
    ---------------------
     2000-03-01 21:00:00
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • time_format(time, format)

    描述:根据格式说明符format格式化time入参。

    参数:

    • time为时间类型表达式、text、datetime、date或time等类型。

    • format为text类型,支持格式如表14所示。

      format取值含义
      %f微秒(000000至999999)。
      %H小时(00到23)。
      %h、%I小时(00到12)。
      %l小时(0到12)。
      %k小时(0到838)。
      %i分钟(00至59)。
      %pAM or PM。
      %r时间为12小时AM或PM格式(hh:mm:ss AM / PM)。
      %S、%s秒(00到59)。
      %T24小时格式的时间(hh:mm:ss)。
      %a、%b、%D、%j、%M、%U、%u、%V、%v、%W、%w、%X、%xNULL。
      %c、%e0。
      %d、%m、%y00。
      %Y0000。
      %其他字符/其他字符,如%A/A返回字符本身,如A。
      %单个字符+字符串s解析(%单个字符),拼接s。

    返回值类型:text

    示例:

    gaussdb=# SELECT TIME_FORMAT('25:30:30', '%T|%r|%H|%h|%I|%i|%S|%f|%p|%k');
                       time_format                    
    --------------------------------------------------
     25:30:30|01:30:30 AM|25|01|01|30|30|000000|AM|25
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • time_to_sec()

    描述:将time入参转化为秒数。

    参数:入参为时间类型表达式、TEXT、DATETIME、DATE或TIME等类型。时间表达式按照TIME来解析。

    返回值类型:int

    示例:

    gaussdb=# SELECT time_to_sec('00:00:01');
     time_to_sec 
    -------------
               1
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • timediff()

    描述:计算两个时间之间的差值,并返回一个时间间隔。

    参数:有两个参数,为时间类型表达式、text、datetime、date或time等类型。

    返回值类型:TIME WITHOUT TIMEZONE

    示例:

    gaussdb=# SELECT timediff(date'2022-12-30',20221229);
     timediff 
    ----------
     24:00:00
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • timestampadd(unit,interval,datetime_expr)

    描述:返回一个新的时间戳,该时间戳是通过将unit的多个interval添加到datetime_expr来计算的。

    参数:参数介绍如表15所示。

    参数类型描述取值范围
    unit关键字时间间隔单位。YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND、MICROSECOND、Y、MM(月)、D、H、M(分钟)、S、US、YRS、QTR、MON、HRS、MIN、YEARS、WEEKS或HOURS等。
    intervalnumeric时间间隔数值。和类型范围一致。
    datetime_expr时间类型表达式、text、datetime、date或time等类型需要变更的时间日期。若为text类型则返回text,为time则返回time,其他情况返回datetime。和类型范围一致。

    返回值类型:DATETIME、TEXT、TIME WITHOUT TIMEZONE

    示例:

    gaussdb=# SELECT TIMESTAMPADD(DAY,-2,'2022-07-27');
     timestampadd 
    --------------
     2022-07-25
    (1 row)
    

    • 该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。
    • timestampadd实际注册的函数为timestamp_add,可以用“\df timestamp_add”等指令查询函数详细入参与返回值。
    • 在prepare语句中,timestampadd的第一个参数为关键字,不支持使用参数1替代使用,例如:preparep1asselecttimestampadd(1替代使用,例如:prepare p1 as select timestampadd(1, -2, '2023-01-01');
  • to_days()

    描述:返回指定日期从0年开始的天数。

    参数:入参为时间类型表达式、TEXT、DATETIME、DATE或TIME等类型。时间表达式按照DATE来解析。

    返回值类型:bigint

    示例:

    gaussdb=# SELECT to_days('2000-1-1');
     to_days 
    ---------
      730485
    (1 row)
    

    转存失败,建议直接上传图片文件

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • to_seconds()

    描述:返回入参自公元0年以来的秒数。

    参数:入参为时间类型表达式、TEXT、DATETIME、DATE或TIME等类型。时间表达式按照datetime来解析。

    返回值类型:bigint

    示例:

    gaussdb=# SELECT TO_SECONDS('2009-11-29 13:43:32');
     to_seconds  
    -------------
     63426721412
    (1 row)
    

    该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。

  • unix_timestamp([date])

    描述:返回一个UNIX时间戳,表示自“1970-01-01 08:00”UTC以来的秒数。若无入参,则默认值为调用函数时的datetime时间戳。

    参数:时间类型表达式、text、datetime、date或time等类型。

    返回值类型:numeric

    示例:

    gaussdb=# SELECT UNIX_TIMESTAMP('2022-12-22');
     unix_timestamp 
    ----------------
         1671638400
    (1 row)
    

    该函数仅在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7和b_format_dev_version值为s1时有效。

  • utc_date()

    描述:将函数执行时的当前UTC日期作为“YYYY-MM-DD”格式的值返回。

    返回值类型:date

    示例:

    gaussdb=# SELECT utc_date();
      utc_date  
    ------------
     2023-08-10
    (1 row)
    

    该函数仅在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7和b_format_dev_version值为s1时有效。

  • utc_time()

    描述:将函数执行时的当前UTC时间作为“HH:MM:SS”格式的值返回。

    参数:表示时间精度,int类型,范围为[0,6],缺省时默认值为0。

    返回值类型:time without time zone

    示例:

    gaussdb=# SELECT utc_time();
     utc_time
    ----------
     11:47:53
    (1 row)
    

    该函数仅在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7和b_format_dev_version值为s1时有效。

  • utc_timestamp()

    描述:将函数执行时的当前UTC时间戳作为“YYYY-MM-DD HH:MM:SS”格式的值返回。

    参数:表示时间精度,int类型,范围为[0,6],缺省时默认值为0。

    返回值类型:timestamp without time zone

    示例:

    gaussdb=# SELECT utc_timestamp();
        utc_timestamp
    ---------------------
     2023-08-21 11:51:19
    (1 row)
    

    该函数仅在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7和b_format_dev_version值为s1时有效。

  • week(date[, mode])

    描述:返回日期的周数。

    参数:

    • 参数date:指定日期时间,时间类型表达式、text、datetime、date或time等类型。

    • 可选参数mode的含义如表16所示,缺省时视为0。

      mode一周的第一天范围哪一周是第一周
      0周日0~53今年有周日的周。
      1周一0~53今年有4天及以上的周。
      2周日1~53今年有周日的周。
      3周一1~53今年有4天及以上的周。
      4周日0~53今年有4天及以上的周。
      5周一0~53今年有周一的周。
      6周日1~53今年有4天及以上的周。
      7周一1~53今年有周一的周。

    返回值类型:bigint

    示例:

    gaussdb=# SELECT week(date'2000-01-01', 1);
     week 
    ------
        0
    (1 row)
    
    gaussdb=# SELECT week('2000-01-01', 2);
     week 
    ------
       52
    (1 row)
    

    该函数仅在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7和b_format_dev_version值为s1时有效。

  • weekday()

    描述:返回一个日期的工作日索引值,即星期一为0,星期二为1,星期三为2,星期四为3,星期五为4,星期六为5,星期日为6。

    参数:时间类型表达式、text、datetime、date或time等类型。

    返回值类型:bigint

    示例:

    gaussdb=# SELECT weekday('1970-01-01 12:00:00');
     weekday 
    ---------
           3
    (1 row)
    

    该函数仅在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7和b_format_dev_version值为s1时有效。

  • weekofyear(date)

    描述:返回日期时间的日历周,范围1~53。等同于week(date, 3)。

    参数:

    • date:指定日期时间,时间类型表达式、text、datetime、date或time等类型。
    • 函数等同于week(date, 3),详见week(date[,mode])

    返回值类型:bigint

    示例:

    gaussdb=# SELECT weekofyear('1970-05-22');
     weekofyear 
    ------------
             21
    (1 row)
    

    该函数仅在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7和b_format_dev_version值为s1时有效。

  • year()

    描述:提取日期时间的年份部分,将结果返回。

    参数:入参为指定提取的日期时间,是时间类型表达式、text、datetime、date或time等类型。

    返回值类型:int

    示例:

    gaussdb=# SELECT year('23-05-22');
     year 
    ------
     2023
    (1 row)
    

    该函数仅在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7和b_format_dev_version值为s1时有效。

  • yearweek(date[, mode])

    描述:返回日期的年份和周数。

    参数:

    • 参数date:指定日期时间。

    • date可取的类型:DATE、DATETIME、TIMESTAMP、TIME、TEXT、NUMERIC等。

    • 可选参数mode的含义如表17所示,缺省时视为0。

      mode一周的第一天范围哪一周是第一周
      0周日0~53今年有周日的周。
      1周一0~53今年有4天及以上的周。
      2周日1~53今年有周日的周。
      3周一1~53今年有4天及以上的周。
      4周日0~53今年有4天及以上的周。
      5周一0~53今年有周一的周。
      6周日1~53今年有4天及以上的周。
      7周一1~53今年有周一的周。

    返回值类型:bigint

    示例:

    gaussdb=# SELECT yearweek(datetime'2000-01-01', 3);
     yearweek 
    ----------
       199952
    (1 row)
    

    该函数仅在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7和b_format_dev_version值为s1时有效。

表18显示了可以用于截断日期和时间值的模板。

类别模式描述
微秒MICROSECON截断日期/时间,精确到微秒(000000 - 999999)
US
USEC
USECOND
毫秒MILLISECON截断日期/时间,精确到毫秒(000 - 999)
MS
MSEC
MSECOND
S截断日期/时间,精确到秒(00 - 59)
SEC
SECOND
分钟M截断日期/时间,精确到分钟(00 - 59)
MI
MIN
MINUTE
小时H截断日期/时间,精确到小时(00 - 23)
HH
HOUR
HR
D截断日期/时间,精确到天(01-01 - 12-31)
DAY
DD
DDD
J
W截断日期/时间,精确到周(本周的第一天)
WEEK
MM截断日期/时间,精确到月(本月的第一天)
MON
MONTH
季度Q截断日期/时间,精确到季度(本季度的第一天)
QTR
QUARTER
Y截断日期/时间,精确到年(本年的第一天)
YEAR
YR
YYYY
十年DEC截断日期/时间,精确到十年(本十年的第一天)
DECADE
世纪C截断日期/时间,精确到世纪(本世纪的第一天)
CC
CENT
CENTURY
千年MIL截断日期/时间,精确到千年(本千年的第一天)
MILLENNIA
MILLENNIUM

类别模式描述
分钟M截断或四舍五入日期/时间,精确到分钟(00 - 59)
MI
MIN
MINUTE
小时H截断或四舍五入日期/时间,精确到小时(00 - 23)
HH
HOUR
HR
HH12
HH24
DD截断或四舍五入日期/时间,精确到天(01-01 - 12-31)
DDD
J
ISO周IW截断或四舍五入日期/时间,精确到周(本周的第一天,第一天为周一)
DAY截断或四舍五入日期/时间,精确到周(本周的第一天,第一天为周日)
DY
D
月周W截断或四舍五入日期/时间,精确到周(本周的第一天,第一天为本月第一天的周数)
年周WW截断或四舍五入日期/时间,精确到周(本周的第一天,第一天为本年第一天的周数)
MM截断或四舍五入日期/时间,精确到月(本月的第一天)
MON
MONTH
RM
季度Q截断或四舍五入日期/时间,精确到季度(本季度的第一天)
QTR
QUARTER
Y截断或四舍五入日期/时间,精确到年(本年的第一天)
YEAR
YR
YYYY
SYYYY
YYY
YY
SYEAR
十年DEC截断或四舍五入日期/时间,精确到十年(本十年的第一天)
DECADE
世纪C截断或四舍五入日期/时间,精确到世纪(本世纪的第一天)
CC
CENT
CENTURY
SCC
千年MIL截断或四舍五入日期/时间,精确到千年(本千年的第一天)
MILLENNIA
MILLENNIUM

表19中行为仅在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s1的情况下有效。

  • timestamp_diff(text, timestamp, timestamp)

    描述:计算两个日期时间之间的差值,截取到参数text指定的精度。

    返回值类型:bigint

    示例:

    | ``` gaussdb=# SELECT timestamp_diff('year','2018-01-01','2020-04-01'); timestamp_diff ---------------- 2 (1 row) gaussdb=# SELECT timestamp_diff('month','2018-01-01','2020-04-01'); timestamp_diff ---------------- 27 (1 row) gaussdb=# SELECT timestamp_diff('quarter','2018-01-01','2020-04-01'); timestamp_diff ---------------- 9 (1 row) gaussdb=# SELECT timestamp_diff('week','2018-01-01','2020-04-01'); timestamp_diff ---------------- 117 (1 row) gaussdb=# SELECT timestamp_diff('day','2018-01-01','2020-04-01'); timestamp_diff ---------------- 821 (1 row) gaussdb=# SELECT timestamp_diff('hour','2018-01-01 10:10:10','2018-01-01 12:12:12'); timestamp_diff ---------------- 2 (1 row) gaussdb=# SELECT timestamp_diff('minute','2018-01-01 10:10:10','2018-01-01 12:12:12'); timestamp_diff ---------------- 122 (1 row) gaussdb=# SELECT timestamp_diff('second','2018-01-01 10:10:10','2018-01-01 10:12:12'); timestamp_diff ---------------- 122 (1 row) gaussdb=# SELECT timestamp_diff('microsecond','2018-01-01 10:10:10','2018-01-01 10:12:12'); timestamp_diff ---------------- 122000000 (1 row)

    | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    
TIMESTAMPDIFF
  • TIMESTAMPDIFF( unit , timestamp_expr1, timestamp_expr2 )

    描述:timestampdiff函数计算两个时间之间(timestamp_expr2-timestamp_expr1)的差值,并以unit形式返回结果。等效于timestamp_diff(text, timestamp, timestamp)。

    参数:timestamp_expr1、timestamp_expr2为时间类型表达式、text、datetime、date或time等类型。unit表示的是两个日期差的单位。

    返回值类型:bigint

    • 该函数仅在MySQL模式数据库中有效。
    • timestampdiff在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时,调用的函数实际上注册为b_timestampdiff;在MySQL模式数据库中且未开启guc参数时,调用的函数注册为timestamp_diff,可以用“\df b_timestampdiff”等指令查询函数详细入参与返回值。
  • year

    年份。

    | ``` gaussdb=# SELECT TIMESTAMPDIFF(YEAR, '2018-01-01', '2020-01-01'); timestamp_diff ---------------- 2 (1 row)

    | ----------------------------------------------------------------------------------------------------------------------------------- |
    
  • quarter

    季度。

    | ``` gaussdb=# SELECT TIMESTAMPDIFF(QUARTER, '2018-01-01', '2020-01-01'); timestamp_diff ---------------- 8 (1 row)

    | -------------------------------------------------------------------------------------------------------------------------------------- |
    
    
  • month

    月份。

    | ``` gaussdb=# SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2020-01-01'); timestamp_diff ---------------- 24 (1 row)

    | ------------------------------------------------------------------------------------------------------------------------------------ |
    
    
  • week

    星期。

    | ``` gaussdb=# SELECT TIMESTAMPDIFF(WEEK, '2018-01-01', '2020-01-01'); timestamp_diff ---------------- 104 (1 row)

    | ----------------------------------------------------------------------------------------------------------------------------------- |
    
    
  • day

    天。

    | ``` gaussdb=# SELECT TIMESTAMPDIFF(DAY, '2018-01-01', '2020-01-01'); timestamp_diff ---------------- 730 (1 row)

    | ---------------------------------------------------------------------------------------------------------------------------------- |
    
  • hour

    小时。

    | ``` gaussdb=# SELECT TIMESTAMPDIFF(HOUR, '2020-01-01 10:10:10', '2020-01-01 11:11:11'); timestamp_diff ---------------- 1 (1 row)

    | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
    
  • minute

    分钟。

    | ``` gaussdb=# SELECT TIMESTAMPDIFF(MINUTE, '2020-01-01 10:10:10', '2020-01-01 11:11:11'); timestamp_diff ---------------- 61 (1 row)

    | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
    
  • second

    秒。

    | ``` gaussdb=# SELECT TIMESTAMPDIFF(SECOND, '2020-01-01 10:10:10', '2020-01-01 11:11:11'); timestamp_diff ---------------- 3661 (1 row)

    | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
    
  • microseconds

    秒域(包括小数部分)乘以1,000,000。

    | ``` gaussdb=# SELECT TIMESTAMPDIFF(MICROSECOND, '2020-01-01 10:10:10.000000', '2020-01-01 10:10:10.111111'); timestamp_diff ---------------- 111111 (1 row)

    | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    

EXTRACT
  • EXTRACT( field FROM source )

    extract函数从日期或时间的数值里抽取子域,比如年、小时等。source必须是一个timestamp、time或interval类型的值表达式(类型为date的表达式转换为timestamp,因此也可以用)。field是一个标识符或者字符串,它指定从源数据中抽取的域。extract函数返回类型为double precision的数值。field的取值范围如下所示。

  • century

    世纪。

    第一个世纪从0001-01-01 00:00:00 AD开始。这个定义适用于所有使用阳历的国家。没有0世纪,直接从公元前1世纪到公元1世纪。

    | ``` gaussdb=# SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13'); date_part ----------- 20 (1 row)

    | --------------------------------------------------------------------------------------------------------------------------- |
    
    
  • day

    • 如果source为timestamp,表示月份里的日期(1-31)。

      | ``` gaussdb=# SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 16 (1 row)

      | ----------------------------------------------------------------------------------------------------------------------- |
      
      
    • 如果source为interval,表示天数。

      | ``` gaussdb=# SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute'); date_part ----------- 40 (1 row)

      | ------------------------------------------------------------------------------------------------------------------- |
      
      
  • decade

    年份除以10。

    | ``` gaussdb=# SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 200 (1 row)

    | -------------------------------------------------------------------------------------------------------------------------- |
    
    
  • dow

    每周的星期几,星期天(0)到星期六(6)。

    | ``` gaussdb=# SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 5 (1 row)

    | ----------------------------------------------------------------------------------------------------------------------- |
    
    
  • doy

    一年的第几天(1~365/366)。

    | ``` gaussdb=# SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 47 (1 row)

    | ----------------------------------------------------------------------------------------------------------------------- |
    
    
  • epoch

    • 如果source为timestamp with time zone,表示自1970-01-01 00:00:00-00 UTC以来的秒数(结果可能是负数);

      如果source为date和timestamp,表示自1970-01-01 00:00:00-00当地时间以来的秒数;

      如果source为interval,表示时间间隔的总秒数。

      | ``` gaussdb=# SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08'); date_part -------------- 982384720.12 (1 row)

      | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
      
      | ```
      gaussdb=# SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');  date_part  -----------     442800 (1 row) 
      ``` |
      | ------------------------------------------------------------------------------------------------------------------- |
      
      
    • 将epoch值转换为时间戳的方法。

      | ``` gaussdb=# SELECT TIMESTAMP WITH TIME ZONE 'epoch' + 982384720.12 * INTERVAL '1 second' AS RESULT; result --------------------------- 2001-02-17 12:38:40.12+08 (1 row)

      | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
      
      
  • hour

    小时域(0-23)。

    | ``` gaussdb=# SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 20 (1 row)

    | ------------------------------------------------------------------------------------------------------------------------ |
    
    
  • isodow

    一周的第几天(1-7)。

    星期一为1,星期天为7。

    除了星期天外,都与dow相同。

    | ``` gaussdb=# SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40'); date_part ----------- 7 (1 row)

    | -------------------------------------------------------------------------------------------------------------------------- |
    
    
  • isoyear

    日期中的ISO 8601标准年(不适用于间隔)。

    每个带有星期一开始的周中包含1月4日的ISO年,所以在年初的1月或12月下旬的ISO年可能会不同于阳历的年。详细信息请参见后续的week描述。

    | ``` gaussdb=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01'); date_part ----------- 2005 (1 row) gaussdb=# SELECT EXTRACT(WEEK FROM TIMESTAMP '2006-01-01 00:00:40'); date_part ----------- 52 (1 row)

    | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    
    

    gaussdb=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02'); date_part

      2006
    

    (1 row) gaussdb=# SELECT EXTRACT(WEEK FROM TIMESTAMP '2006-01-02 00:00:40'); date_part

         1
    

    (1 row)

  • microseconds

    秒域(包括小数部分)乘以1,000,000。

    | ``` gaussdb=# SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5'); date_part ----------- 28500000 (1 row)

    | ------------------------------------------------------------------------------------------------------------------ |
    
    
  • millennium

    千年。

    20世纪(19xx年)里面的年份在第二个千年里。第三个千年从2001年1月1日零时开始。

    | ``` gaussdb=# SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 3 (1 row)

    | ------------------------------------------------------------------------------------------------------------------------------ |
    
    
  • milliseconds

    秒域(包括小数部分)乘以1000。请注意它包括完整的秒。

    | ``` gaussdb=# SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5'); date_part ----------- 28500 (1 row)

    | ------------------------------------------------------------------------------------------------------------------ |
    
    
  • minute

    分钟域(0-59)。

    | ``` gaussdb=# SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 38 (1 row)

    | -------------------------------------------------------------------------------------------------------------------------- |
    
    
  • month

    如果source为timestamp,表示一年里的月份数(1-12)。

    | ``` gaussdb=# SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 2 (1 row)

    | ------------------------------------------------------------------------------------------------------------------------- |
    
    如果source为interval,表示月的数目,然后对12取模(0-11)。
    
    | ```
    gaussdb=# SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months');  date_part  -----------          1 (1 row) 
    ``` |
    | ---------------------------------------------------------------------------------------------------------------------- |
    
    
  • quarter

    该天所在的该年的季度(1-4)。

    | ``` gaussdb=# SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 1 (1 row)

    | --------------------------------------------------------------------------------------------------------------------------- |
    
    
  • second

    秒域,包括小数部分(0-59)。

    | ``` gaussdb=# SELECT EXTRACT(SECOND FROM TIME '17:12:28.5'); date_part ----------- 28.5 (1 row)

    | ------------------------------------------------------------------------------------------------------------ |
    
    
  • timezone

    与UTC的时区偏移量,单位为秒。正数对应UTC东边的时区,负数对应UTC西边的时区。

  • timezone_hour

    时区偏移量的小时部分。

  • timezone_minute

    时区偏移量的分钟部分。

  • week

    该天在所在的年份里是第几周。ISO 8601定义一年的第一周包含该年的一月四日(ISO-8601 的周从星期一开始)。换句话说,一年的第一个星期四在第一周。

    在ISO定义里,一月的头几天可能是前一年的第52或者第53周,十二月的后几天可能是下一年第一周。比如,2006-01-01是2005年的第52周,而2006-01-02是2006年的第1周。建议isoyear字段和week一起使用以得到一致的结果。

    | ``` gaussdb=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01'); date_part ----------- 2005 (1 row) gaussdb=# SELECT EXTRACT(WEEK FROM TIMESTAMP '2006-01-01 00:00:40'); date_part ----------- 52 (1 row)

    | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    
    

    gaussdb=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02'); date_part

      2006
    

    (1 row) gaussdb=# SELECT EXTRACT(WEEK FROM TIMESTAMP '2006-01-02 00:00:40'); date_part

         1
    

    (1 row)

  • year

    年份域。

    | ``` gaussdb=# SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 2001 (1 row)

    | ------------------------------------------------------------------------------------------------------------------------ |
    
date_part

date_part函数是在传统的Ingres函数的基础上制作的(该函数等效于SQL标准函数extract):

date_part(' field ', source )

这里的field参数必须是一个字符串,而不是一个名称。有效的field与extract一样,详细信息请参见EXTRACT

示例:

| ``` gaussdb=# SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 16 (1 row)

| ----------------------------------------------------------------------------------------------------------------------- |

| ```
gaussdb=# SELECT date_part('hour', INTERVAL '4 hours 3 minutes');  date_part  -----------          4 (1 row) 
``` |
| --------------------------------------------------------------------------------------------------------------------- |

[表20](https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/devg-dist/gaussdb-12-0362.html#ZH-CN_TOPIC_0000001865745532__zh-cn_topic_0000001704537309_zh-cn_topic_0283136846_zh-cn_topic_0237121972_zh-cn_topic_0059779084_t2e5425ae98464c3dab59352ff3bfa786)显示了可以用于格式化日期和时间值的格式。

[]()[]()

| 类别                      | 格式                                        | 描述                           |
| :---------------------- | :---------------------------------------- | :--------------------------- |
| 小时                      | HH                                        | 一天的小时数(01-12)                |
| HH12                    | 一天的小时数(01-12)                             |                              |
| HH24                    | 一天的小时数(00-23)                             |                              |
| 分钟                      | MI                                        | 分钟(00-59)                    |
| 秒                       | SS                                        | 秒(00-59)                     |
| FF                      | 微秒(000000-999999)                         |                              |
| FF1                     | 微秒(0-9)                                   |                              |
| FF2                     | 微秒(00-99)                                 |                              |
| FF3                     | 微秒(000-999)                               |                              |
| FF4                     | 微秒(0000-9999)                             |                              |
| FF5                     | 微秒(00000-99999)                           |                              |
| FF6                     | 微秒(000000-999999)                         |                              |
| SSSSS                   | 午夜后的秒(0-86399)                            |                              |
| 上、下午                    | AM或A.M.                                   | 上午标识                         |
| PM或P.M.                 | 下午标识                                      |                              |
| 年                       | Y,YYY                                     | 带逗号的年(4和更多位)                 |
| SYYYY                   | 公元前四位年                                    |                              |
| YYYY                    | 年(4和更多位)                                  |                              |
| YYY                     | 年的后三位                                     |                              |
| YY                      | 年的后两位                                     |                              |
| Y                       | 年的最后一位                                    |                              |
| IYYY                    | ISO年(4位或更多位)                              |                              |
| IYY                     | ISO年的最后三位                                 |                              |
| IY                      | ISO年的最后两位                                 |                              |
| I                       | ISO年的最后一位                                 |                              |
| RR                      | 年的后两位(可在21世纪存储20世纪的年份)                    |                              |
| RRRR                    | 可接收4位年或两位年。若是两位,则和RR的返回值相同,若是四位,则和YYYY相同。 |                              |
| -   BC或B.C.
-   AD或A.D. | 纪元标识。BC(公元前),AD(公元后)。                     |                              |
| 月                       | MONTH                                     | 全长大写月份名(空白填充为9字符)            |
| MON                     | 大写缩写月份名(3字符)                              |                              |
| MM                      | 月份数(01-12)                                |                              |
| RM                      | 罗马数字的月份(I-XII ;I=JAN)(大写)                 |                              |
| 天                       | DAY                                       | 全长大写日期名(空白填充为9字符)            |
| DY                      | 缩写大写日期名(3字符)                              |                              |
| DDD                     | 一年里的日(001-366)                            |                              |
| DD                      | 一个月里的日(01-31)                             |                              |
| D                       | 一周里的日(1-7 ;周日是 1)                         |                              |
| 周                       | W                                         | 一个月里的周数(1-5)(第一周从该月第一天开始)    |
| WW                      | 一年里的周数(1-53)(第一周从该年的第一天开始)                |                              |
| IW                      | ISO一年里的周数(第一个星期四在第一周里)                    |                              |
| 世纪                      | CC                                        | 世纪(2位)(21 世纪从 2001-01-01 开始) |
| 儒略日                     | J                                         | 儒略日(自公元前 4712 年 1 月 1 日来的天数) |
| 季度                      | Q                                         | 季度                           |

在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s1的情况下新增用于格式化日期和时间值的模式:

| 类别    | 模式                      | 描述                  |
| :---- | :---------------------- | :------------------ |
| 世纪    | SCC                     | 世纪标识,公元前会显示-        |
| 年     | SYYYY                   | 返回数字型年,公元前会显示-      |
| RR    | 返回日期的2位年份               |                     |
| RRRR  | 返回日期的4位年份               |                     |
| YEAR  | 返回字符型年                  |                     |
| SYEAR | 返回字符型年,公元前会显示-          |                     |
| 日期格式  | DL                      | 返回指定长日期形式           |
| DS    | 返回指定短日期                 |                     |
| TS    | 返回指定时间格式                |                     |
| 秒     | FF7                     | 微秒(0000000-9999990) |
| FF8   | 微秒(00000000-99999900)   |                     |
| FF9   | 微秒(000000000-999999000) |                     |

![](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/4b0235b5c7b44663b742564633d4a468~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402394&x-signature=xy8dUeat6RMe1YyweEABrRwTODU%3D)

RR计算年的规则如下:

-   输入的两位年份在00~49之间:

    []()[]()当前年份的后两位在00~49之间,返回值年份的前两位和当前年份的前两位相同。

    当前年份的后两位在50~99之间,返回值年份的前两位是当前年份的前两位加1。

-   输入的两位年份在50~99之间:

    []()[]()当前年份的后两位在00~49之间,返回值年份的前两位是当前年份的前两位减1。

    当前年份的后两位在50~99之间,返回值年份的前两位和当前年份的前两位相同。

![](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/dfffea5690b94a9fa342cbcf217f2a61~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771402394&x-signature=wASO8Yn8pLD88u8dSWEPAfzj9Ro%3D)

此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s1的情况下:

-   to_date, to_timestamp函数支持FX模式(输入和模式严格对应),支持X模式(小数点)。
-   输入模式不能出现超过一次,表示相同信息的模式不能同时出现。如SYYYY和BC不能同时出现。
-   模式大小写不敏感。
-   建议输入和模式之间使用分隔符,否则不保证行为与O完全一致。