GaussDB-GaussDB-时间和日期处理函数和操作符(下)
-
curdate()
描述:返回本地函数调用开始时刻的系统日期。支持在同一连接内修改时区,返回的日期受时区影响。
返回值类型:date
示例:
| ``` gaussdb=# SELECT curdate(); curdate ------------ 2023-08-10 (1 row)
| ---------------------------------------------------------------------------------- |  该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。 -
curtime([precision])
参数:表示精度(秒后小数的位数),int类型,范围为[0,6],缺省时默认值为0,能转成范围内整型值可以输出对应精度时间值,其他无效值会报错。
返回值类型:time without time zone
实现方式:注册系统函数curtime。
示例:
| ``` gaussdb=# SELECT curtime(3); curtime -------------- 16:59:57.203 (1 row)
| ----------------------------------------------------------------------------------------- |  该函数在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)- 该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。
- 在prepare语句中,date_add的第二个参数为interval表达式,不支持使用参数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等类型 需要格式化的日期。 和类型范围一致。 format text 格式化字符串。 请参见表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)。 %p AM或者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)- 该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。
- 在prepare语句中,date_sub的第二个参数为interval表达式,不支持使用参数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)- 该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。
- 在prepare语句中,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)。 %p AM或者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)- 该函数在sql_compatibility = 'MYSQL',且参数b_format_version值为5.7、b_format_dev_version值为s1时有效。
- 在prepare语句中,subdate的第二个参数为interval表达式,当使用参数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)
参数:
-
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)。 %p AM or PM。 %r 时间为12小时AM或PM格式(hh:mm:ss AM / PM)。 %S、%s 秒(00到59)。 %T 24小时格式的时间(hh:mm:ss)。 %a、%b、%D、%j、%M、%U、%u、%V、%v、%W、%w、%X、%x NULL。 %c、%e 0。 %d、%m、%y 00。 %Y 0000。 %其他字符/其他字符,如%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()
参数:入参为时间类型表达式、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等。 interval numeric 时间间隔数值。 和类型范围一致。 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, -2, '2023-01-01');
-
to_days()
参数:入参为时间类型表达式、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()
参数:入参为时间类型表达式、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时有效。
-
参数:
-
参数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
| ``` 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
| ``` gaussdb=# SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 200 (1 row)
| -------------------------------------------------------------------------------------------------------------------------- | -
dow
| ``` gaussdb=# SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 5 (1 row)
| ----------------------------------------------------------------------------------------------------------------------- | -
doy
| ``` 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
| ``` gaussdb=# SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 20 (1 row)
| ------------------------------------------------------------------------------------------------------------------------ | -
isodow
星期一为1,星期天为7。
除了星期天外,都与dow相同。
| ``` gaussdb=# SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40'); date_part ----------- 7 (1 row)
| -------------------------------------------------------------------------------------------------------------------------- | -
每个带有星期一开始的周中包含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
| ``` 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
| ``` gaussdb=# SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5'); date_part ----------- 28500 (1 row)
| ------------------------------------------------------------------------------------------------------------------ | -
minute
| ``` 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
| ``` gaussdb=# SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 1 (1 row)
| --------------------------------------------------------------------------------------------------------------------------- | -
second
| ``` gaussdb=# SELECT EXTRACT(SECOND FROM TIME '17:12:28.5'); date_part ----------- 28.5 (1 row)
| ------------------------------------------------------------------------------------------------------------ | -
timezone
-
timezone_hour
-
timezone_minute
-
该天在所在的年份里是第几周。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) | |

RR计算年的规则如下:
- 输入的两位年份在00~49之间:
[]()[]()当前年份的后两位在00~49之间,返回值年份的前两位和当前年份的前两位相同。
当前年份的后两位在50~99之间,返回值年份的前两位是当前年份的前两位加1。
- 输入的两位年份在50~99之间:
[]()[]()当前年份的后两位在00~49之间,返回值年份的前两位是当前年份的前两位减1。
当前年份的后两位在50~99之间,返回值年份的前两位和当前年份的前两位相同。

此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s1的情况下:
- to_date, to_timestamp函数支持FX模式(输入和模式严格对应),支持X模式(小数点)。
- 输入模式不能出现超过一次,表示相同信息的模式不能同时出现。如SYYYY和BC不能同时出现。
- 模式大小写不敏感。
- 建议输入和模式之间使用分隔符,否则不保证行为与O完全一致。