9.9. 日期/时间函数和运算符
表 9.30 显示了用于日期/时间值处理的可用函数,详细信息见以下小节。表 9.29 说明了基本算术运算符(、等)的行为。有关格式化函数,请参阅第 9.8 节。您应该熟悉第 8.5 节中有关日期/时间数据类型的背景信息。+``*
此外,表 9.1 中所示的常用比较运算符可用于日期/时间类型。日期和时间戳(带或不带时区)都是可比较的,而时间(带或不带时区)和间隔只能与相同数据类型的其他值进行比较。将没有时区的时间戳与具有时区的时间戳进行比较时,假定前一个值以时区配置参数指定的时区给出,并旋转为 UTC 以便与后一个值(内部已采用 UTC)进行比较。同样,在将日期值与时间戳进行比较时,假定日期值表示区域中的午夜。TimeZone
下面描述的所有 take 或 input 的函数和运算符实际上都有两种变体:一种是 take or ,另一种是 take or 。为简洁起见,这些变体不单独显示。此外,和运算符以交换对的形式出现(例如两者和);我们只显示每个这样的对中的一个。time``timestamp``time with time zone``timestamp with time zone``time without time zone``timestamp without time zone``+``*``date``+``integer``integer``+``date
表 9.29.日期/时间运算符
| 算子 | 例 | 结果 |
|---|---|---|
+ | date '2001-09-28' + integer '7' | date '2001-10-05' |
+ | date '2001-09-28' + interval '1 hour' | timestamp '2001-09-28 01:00:00' |
+ | date '2001-09-28' + time '03:00' | timestamp '2001-09-28 03:00:00' |
+ | interval '1 day' + interval '1 hour' | interval '1 day 01:00:00' |
+ | timestamp '2001-09-28 01:00' + interval '23 hours' | timestamp '2001-09-29 00:00:00' |
+ | time '01:00' + interval '3 hours' | time '04:00:00' |
- | - interval '23 hours' | interval '-23:00:00' |
- | date '2001-10-01' - date '2001-09-28' | integer '3'(天) |
- | date '2001-10-01' - integer '7' | date '2001-09-24' |
- | date '2001-09-28' - interval '1 hour' | timestamp '2001-09-27 23:00:00' |
- | time '05:00' - time '03:00' | interval '02:00:00' |
- | time '05:00' - interval '2 hours' | time '03:00:00' |
- | timestamp '2001-09-28 23:00' - interval '23 hours' | timestamp '2001-09-28 00:00:00' |
- | interval '1 day' - interval '1 hour' | interval '1 day -01:00:00' |
- | timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00' | interval '1 day 15:00:00' |
* | 900 * interval '1 second' | interval '00:15:00' |
* | 21 * interval '1 day' | interval '21 days' |
* | double precision '3.5' * interval '1 hour' | interval '03:30:00' |
/ | interval '1 hour' / double precision '1.5' | interval '00:40:00' |
表 9.30.日期/时间函数
| 功能 | 返回类型 | 描述 | 例 | 结果 |
|---|---|---|---|---|
age(timestamp, timestamp) | interval | 减去参数,产生使用年和月的“符号”结果,而不仅仅是天 | age(timestamp '2001-04-10', timestamp '1957-06-13') | 43 years 9 mons 27 days |
age(timestamp) | interval | 减去(午夜)current_date | age(timestamp '1957-06-13') | 43 years 8 mons 3 days |
clock_timestamp() | timestamp with time zone | 当前日期和时间(语句执行期间的更改);请参阅第 9.9.4 节 | ||
current_date | date | 当前日期;请参阅第 9.9.4 节 | ||
current_time | time with time zone | 一天中的当前时间;请参阅第 9.9.4 节 | ||
current_timestamp | timestamp with time zone | 当前日期和时间(当前交易的开始);请参阅第 9.9.4 节 | ||
date_part(text, timestamp) | double precision | 获取子字段(相当于 );请参阅第 9.9.1 节extract | date_part('hour', timestamp '2001-02-16 20:38:40') | 20 |
date_part(text, interval) | double precision | 获取子字段(相当于 );请参阅第 9.9.1 节extract | date_part('month', interval '2 years 3 months') | 3 |
date_trunc(text, timestamp) | timestamp | 截断到指定的精度;另请参阅第 9.9.2 节 | date_trunc('hour', timestamp '2001-02-16 20:38:40') | 2001-02-16 20:00:00 |
date_trunc(text, interval) | interval | 截断到指定的精度;另请参阅第 9.9.2 节 | date_trunc('hour', interval '2 days 3 hours 40 minutes') | 2 days 03:00:00 |
extract(field from timestamp) | double precision | 获取子字段;请参阅第 9.9.1 节 | extract(hour from timestamp '2001-02-16 20:38:40') | 20 |
extract(field from interval) | double precision | Get subfield; see Section 9.9.1 | extract(month from interval '2 years 3 months') | 3 |
isfinite(date) | boolean | Test for finite date (not +/-infinity) | isfinite(date '2001-02-16') | true |
isfinite(timestamp) | boolean | Test for finite time stamp (not +/-infinity) | isfinite(timestamp '2001-02-16 21:28:30') | true |
isfinite(interval) | boolean | Test for finite interval | isfinite(interval '4 hours') | true |
justify_days(interval) | interval | Adjust interval so 30-day time periods are represented as months | justify_days(interval '35 days') | 1 mon 5 days |
justify_hours(interval) | interval | Adjust interval so 24-hour time periods are represented as days | justify_hours(interval '27 hours') | 1 day 03:00:00 |
justify_interval(interval) | interval | Adjust interval using and , with additional sign adjustmentsjustify_days``justify_hours | justify_interval(interval '1 mon -1 hour') | 29 days 23:00:00 |
localtime | time | Current time of day; see Section 9.9.4 | ||
localtimestamp | timestamp | Current date and time (start of current transaction); see Section 9.9.4 | ||
make_date(year int, month int, day int) | date | Create date from year, month and day fields | make_date(2013, 7, 15) | 2013-07-15 |
make_interval(years int DEFAULT 0, months int DEFAULT 0, weeks int DEFAULT 0, days int DEFAULT 0, hours int DEFAULT 0, mins int DEFAULT 0, secs double precision DEFAULT 0.0) | interval | Create interval from years, months, weeks, days, hours, minutes and seconds fields | make_interval(days => 10) | 10 days |
make_time(hour int, min int, sec double precision) | time | Create time from hour, minute and seconds fields | make_time(8, 15, 23.5) | 08:15:23.5 |
make_timestamp(year int, month int, day int, hour int, min int, sec double precision) | timestamp | Create timestamp from year, month, day, hour, minute and seconds fields | make_timestamp(2013, 7, 15, 8, 15, 23.5) | 2013-07-15 08:15:23.5 |
make_timestamptz(year int, month int, day int, hour int, min int, sec double precision, [ timezone text ]) | timestamp with time zone | 从年、月、日、小时、分钟和秒字段中创建时区时间戳;如果未指定*时区*,则使用当前时区 | make_timestamptz(2013, 7, 15, 8, 15, 23.5) | 2013-07-15 08:15:23.5+01 |
now() | timestamp with time zone | 当前日期和时间(当前交易的开始);请参阅第 9.9.4 节 | ||
statement_timestamp() | timestamp with time zone | 当前日期和时间(当前报表的开始);请参阅第 9.9.4 节 | ||
timeofday() | text | 当前日期和时间(如 ,但作为字符串);请参阅第 9.9.4 节clock_timestamp``text | ||
transaction_timestamp() | timestamp with time zone | 当前日期和时间(当前交易的开始);请参阅第 9.9.4 节 | ||
to_timestamp(double precision) | timestamp with time zone | 将 Unix 纪元(自 1970-01-01 00:00:00+00 以来的秒数)转换为时间戳 | to_timestamp(1284352323) | 2010-09-13 04:32:03+00 |
(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)
当两个时间段(由其端点定义)重叠时,此表达式生成 true,当它们不重叠时,此表达式生成 false。终结点可以指定为日期、时间或时间戳对;或作为日期、时间或时间戳,后跟间隔。当提供一对值时,可以先写入开始或结束; 自动将货币对的较早值作为开始。每个时间段都被视为表示半开放间隔开始时间结束,除非*开始和* ***结束相等,在这种情况下它表示单个时间*时刻。例如,这意味着只有一个共同端点的两个时间段不会重叠。OVERLAPS``<=``<
SELECT (DATE '2001-02-16', DATE '2001-12-21') OVERLAPS
(DATE '2001-10-30', DATE '2002-10-30');
Result: true
SELECT (DATE '2001-02-16', INTERVAL '100 days') OVERLAPS
(DATE '2001-10-30', DATE '2002-10-30');
Result: false
SELECT (DATE '2001-10-29', DATE '2001-10-30') OVERLAPS
(DATE '2001-10-30', DATE '2001-10-31');
Result: false
SELECT (DATE '2001-10-30', DATE '2001-10-30') OVERLAPS
(DATE '2001-10-30', DATE '2001-10-31');
Result: true
当将值添加到值(或从中减去值)时,天数组件将日期前进或减少指定的天数,使一天中的时间保持不变。在夏令时更改期间(当会话时区设置为识别 DST 的时区时),这意味着不一定等于 。例如,将会话时区设置为 :interval``interval``timestamp with time zone``timestamp with time zone``interval '1 day'``interval '24 hours'``America/Denver
SELECT timestamp with time zone '2005-04-02 12:00:00-07' + interval '1 day';
Result: 2005-04-03 12:00:00-06
SELECT timestamp with time zone '2005-04-02 12:00:00-07' + interval '24 hours';
Result: 2005-04-03 13:00:00-06
发生这种情况是因为由于时区的夏令时更改而跳过了一个小时。2005-04-03 02:00:00``America/Denver
请注意,返回的字段中可能存在歧义,因为不同的月份具有不同的天数。PostgreSQL的方法在计算部分月份时使用两个日期中较早的月份。例如,使用 31 月来产生,而使用 30 月会产生,因为 <> 月有 <> 天,而 <> 月只有 <> 天。months``age``age('2004-06-01', '2004-04-30')``1 mon 1 day``1 mon 2 days
日期和时间戳的减法也可能很复杂。执行减法的一种概念上简单的方法是使用 将每个值转换为秒数,然后减去结果;这将生成两个值之间的秒数。这将根据每月的天数、时区更改和夏令时调整进行调整。使用“-”运算符减去日期或时间戳值将返回值之间的天数(24 小时)和小时/分钟/秒数,并进行相同的调整。该函数返回年、月、日和小时/分钟/秒,执行逐字段减法,然后调整负字段值。以下查询说明了这些方法的差异。样品结果用 ;使用的两个日期之间存在夏令时更改:EXTRACT(EPOCH FROM ...)``age``timezone = 'US/Eastern'
SELECT EXTRACT(EPOCH FROM timestamptz '2013-07-01 12:00:00') -
EXTRACT(EPOCH FROM timestamptz '2013-03-01 12:00:00');
Result: 10537200
SELECT (EXTRACT(EPOCH FROM timestamptz '2013-07-01 12:00:00') -
EXTRACT(EPOCH FROM timestamptz '2013-03-01 12:00:00'))
/ 60 / 60 / 24;
Result: 121.958333333333
SELECT timestamptz '2013-07-01 12:00:00' - timestamptz '2013-03-01 12:00:00';
Result: 121 days 23:00:00
SELECT age(timestamptz '2013-07-01 12:00:00', timestamptz '2013-03-01 12:00:00');
Result: 4 mons
9.9.1. ,EXTRACT``date_part
EXTRACT(field FROM source)
该函数从日期/时间值中检索子字段,例如年或小时。源必须是 、 或 类型的值表达式。(类型的表达式被强制转换为,因此也可以使用。字段是一个标识符或字符串,用于选择要从源值中提取的字段。该函数返回 类型的值。以下是有效的字段名称:extract``timestamp``time``interval``date``timestamp``extract``double precision
-
century世纪
SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13'); Result: 20 SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 21第一个世纪始于公元0001-01-01 00:00:00,尽管他们当时并不知道。此定义适用于所有公历国家。没有世纪数字 0,你从 -1 世纪到 1 世纪。如果您不同意这一点,请写信给您的投诉:教皇,罗马圣彼得大教堂,梵蒂冈。
-
day对于值,日期(月)字段 (1 - 31) ;对于值,为天数
timestamp``intervalSELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 16 SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute'); Result: 40 -
decade年份字段除以 10
SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 200 -
dow星期几为星期日 () 到星期六 (
0``6)SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 5请注意,星期几的编号与函数的编号不同。
extract``to_char(..., 'D') -
doy一年中的一天 (1 - 365/366)
SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 47 -
epoch对于值,自 1970-01-01 00:00:00 UTC 以来的秒数(对于之前的时间戳为负数);for and 值,自 1970-01-01 00:00:00 以来的标称秒数,不考虑时区或夏令时规则;对于值,为间隔中的总秒数
timestamp with time zone``date``timestamp``intervalSELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08'); Result: 982384720.12 SELECT EXTRACT(EPOCH FROM TIMESTAMP '2001-02-16 20:38:40.12'); Result: 982355920.12 SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours'); Result: 442800您可以使用以下命令将纪元值转换回 :
timestamp with time zone``to_timestampSELECT to_timestamp(982384720.12); Result: 2001-02-17 04:38:40.12+00请注意,应用于从 or 值中提取的纪元可能会产生误导性结果:结果将有效地假设原始值是以 UTC 格式给出的,但事实可能并非如此。
to_timestamp``date``timestamp -
hour小时字段 (0 - 23)
SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 20 -
isodow星期几为星期一 () 到星期日 (
1``7)SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40'); Result: 7除周日外,这相同。这与 ISO 8601 星期几编号相匹配。
dow -
isoyear日期所属的 ISO 8601 周编号年份(不适用于间隔)
SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01'); Result: 2005 SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02'); Result: 2006每个 ISO 8601 周编号年都从包含 4 月 <> 日的一周的星期一开始,因此在 <> 月初或 <> 月下旬,ISO 年可能与公历年不同。有关详细信息,请参阅该字段。
week此字段在 8.3 之前的 PostgreSQL 版本中不可用。
-
julian与日期或时间戳对应的儒略日期(不适用于间隔)。不是本地午夜的时间戳会导致分数值。有关详细信息,请参见第 B.7 节。
SELECT EXTRACT(JULIAN FROM DATE '2006-01-01'); Result: 2453737 SELECT EXTRACT(JULIAN FROM TIMESTAMP '2006-01-01 12:00'); Result: 2453737.5 -
microseconds秒字段(包括小数部分)乘以 1 000 000;请注意,这包括整秒数
SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5'); Result: 28500000 -
millennium千年
SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 31900年代的年份是第二个千年。第三个千年始于1年2001月<>日。
-
milliseconds秒字段(包括小数部分)乘以 1000。请注意,这包括整整秒数。
SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5'); Result: 28500 -
minute分钟字段 (0 - 59)
SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 38 -
month对于值,一年中的月份数 (1 - 12) ;对于值,月数,模数 12 (0 - 11)
timestamp``intervalSELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 2 SELECT EXTRACT(MONTH FROM INTERVAL '2 years 3 months'); Result: 3 SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months'); Result: 1 -
quarter日期所在的年份季度 (1 - 4)
SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 1 -
second秒字段,包括小数部分 (0 - 59[7])
SELECT EXTRACT(SECOND FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 40 SELECT EXTRACT(SECOND FROM TIME '17:12:28.5'); Result: 28.5 -
timezone与 UTC 的时区偏移量,以秒为单位。正值对应于 UTC 以东的时区,负值对应于 UTC 以西的区域。(从技术上讲,PostgreSQL不使用UTC,因为不处理闰秒。
-
timezone_hour时区偏移量的小时部分
-
timezone_minute时区偏移量的分钟部分
-
weekISO 8601 周编号周的编号。根据定义,ISO 周从星期一开始,一年的第一周包含该年的 4 月 1 日。换句话说,一年的第一个星期四是该年的第 <> 周。
在 ISO 周编号系统中,52 月初的日期可能是前一年的第 53 周或第 53 周的一部分,而 2004 月下旬的日期可能是下一年第一周的一部分。例如,是 52 年第 2005 周的一部分,是 2013 年第 <> 周的一部分,而是 <> 年第一周的一部分。建议将该字段一起使用以获得一致的结果。
2005-01-01``2006-01-01``2012-12-31``isoyear``weekSELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 7 -
year年份字段。请记住,没有,所以从年中减去年应该小心。
0 AD``BC``ADSELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 2001
注意
当输入值为 +/-无穷大时,对于单调递增的字段(、、、、、、 和 ),返回 +/-无穷大。对于其他字段,返回 NULL。9.6 之前的 PostgreSQL 版本对于所有无限输入的情况都返回零。extract``epoch``julian``year``isoyear``decade``century``millennium
该函数主要用于计算处理。有关显示日期/时间值的格式,请参见第 9.8 节。extract
该函数以传统的Ingres为模型,相当于SQL标准函数:date_part``extract
date_part('field', source)
请注意,此处的*字段*参数需要是字符串值,而不是名称。的有效字段名称与 的相同。date_part``extract
SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
Result: 16
SELECT date_part('hour', INTERVAL '4 hours 3 minutes');
Result: 4
9.9.2.date_trunc
该函数在概念上类似于数字函数。date_trunc``trunc
date_trunc('field', source)
*源是 或 类型的值表达式。(类型和的值分别自动转换为 或。字段*选择将输入值截断到的精度。返回值的类型为 或,所有不重要的字段都设置为零(或 1,表示日和月)。timestamp``interval``date``time``timestamp``interval``timestamp``interval
*字段*的有效值为:
microseconds |
|---|
milliseconds |
second |
minute |
hour |
day |
week |
month |
quarter |
year |
decade |
century |
millennium |
例子:
SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');
Result: 2001-02-16 20:00:00
SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');
Result: 2001-01-01 00:00:00
9.9.3.AT TIME ZONE
将不带时区的时间戳转换为/从带有时区的时间戳和时间值转换为不同的时区。表9.31显示了其变体。AT TIME ZONE
表 9.31.在时区变种
| 表达 | 返回类型 | 描述 |
|---|---|---|
timestamp without time zone AT TIME ZONE zone | timestamp with time zone | 将没有时区的给定时间戳视为位于指定时区 |
timestamp with time zone AT TIME ZONE zone | timestamp without time zone | 将带有时区的给定时间戳转换为新时区,无需指定时区 |
time with time zone AT TIME ZONE zone | time with time zone | 将给定的时区时间转换为新时区 |
在这些表达式中,可以将*所需的时区指定*为文本字符串(例如,)或间隔(例如,)。在文本情况下,可以通过[第 8.5.3 节](https://www.postgresql.org/docs/11/datatype-datetime.html#DATATYPE-TIMEZONES "8.5.3. Time Zones")中描述的任何方式指定时区名称。`'America/Los_Angeles'INTERVAL '-08:00'`
示例(假设本地时区为 ):America/Los_Angeles
SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'America/Denver';
Result: 2001-02-16 19:38:40-08
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'America/Denver';
Result: 2001-02-16 18:38:40
SELECT TIMESTAMP '2001-02-16 20:38:40-05' AT TIME ZONE 'Asia/Tokyo' AT TIME ZONE 'America/Chicago';
Result: 2001-02-16 05:38:40
第一个示例将时区添加到缺少时区的值,并使用当前设置显示该值。第二个示例将带有时区值的时间戳移动到指定的时区,并返回不带时区的值。这允许存储和显示与当前设置不同的值。第三个示例将东京时间转换为芝加哥时间。将时间值转换为其他时区将使用当前活动的时区规则,因为未提供日期。TimeZone``TimeZone
该函数等效于 SQL 兼容结构。timezone(zone, timestamp)``timestamp AT TIME ZONE zone
9.9.4. 当前日期/时间
PostgreSQL 提供了许多返回与当前日期和时间相关的值的函数。这些 SQL 标准函数都根据当前事务的开始时间返回值:
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME(precision)
CURRENT_TIMESTAMP(precision)
LOCALTIME
LOCALTIMESTAMP
LOCALTIME(precision)
LOCALTIMESTAMP(precision)
CURRENT_TIME并按时区提供价值; 并提供没有时区的价值。CURRENT_TIMESTAMP``LOCALTIME``LOCALTIMESTAMP
CURRENT_TIME、、、 和 可以选择采用精度参数,这会导致结果在秒字段中舍入到该多位小数位数。如果没有精度参数,结果将给出完全可用的精度。CURRENT_TIMESTAMP``LOCALTIME``LOCALTIMESTAMP
一些例子:
SELECT CURRENT_TIME;
Result: 14:39:53.662522-05
SELECT CURRENT_DATE;
Result: 2001-12-23
SELECT CURRENT_TIMESTAMP;
Result: 2001-12-23 14:39:53.662522-05
SELECT CURRENT_TIMESTAMP(2);
Result: 2001-12-23 14:39:53.66-05
SELECT LOCALTIMESTAMP;
Result: 2001-12-23 14:39:53.662522
由于这些函数返回当前事务的开始时间,因此它们的值在事务期间不会更改。这被认为是一个功能:目的是允许单个事务具有一致的“当前”时间概念,以便同一事务中的多个修改具有相同的时间戳。
注意
其他数据库系统可能会更频繁地推进这些值。
PostgreSQL 还提供了返回当前语句开始时间的函数,以及调用函数时的实际当前时间。非 SQL 标准时间函数的完整列表如下:
transaction_timestamp()
statement_timestamp()
clock_timestamp()
timeofday()
now()
transaction_timestamp()等效于 ,但命名是为了清楚地反映它返回的内容。 返回当前语句的开始时间(更具体地说,从客户端接收最新命令消息的时间)。 并在事务的第一个命令期间返回相同的值,但在后续命令期间可能会有所不同。 返回实际的当前时间,因此即使在单个 SQL 命令中,其值也会更改。 是一个历史悠久的PostgreSQL函数。像 ,它返回实际的当前时间,但作为格式化字符串而不是值。 是一个传统的PostgreSQL等价物。CURRENT_TIMESTAMP``statement_timestamp()``statement_timestamp()``transaction_timestamp()``clock_timestamp()``timeofday()``clock_timestamp()``text``timestamp with time zone``now()``transaction_timestamp()
所有日期/时间数据类型也接受特殊文本值来指定当前日期和时间(再次解释为事务开始时间)。因此,以下三个都返回相同的结果:now
SELECT CURRENT_TIMESTAMP;
SELECT now();
SELECT TIMESTAMP 'now'; -- but see tip below
提示
在指定稍后要计算的值时,例如在表列的子句中,不要使用第三种形式。一旦常量被解析,系统就会转换为 a,这样当需要默认值时,将使用创建表的时间!在使用默认值之前,不会计算前两个窗体,因为它们是函数调用。因此,它们将给出默认为行插入时间的所需行为。(另请参见第 8.5.1.4 节。DEFAULT``now``timestamp
9.9.5. 延迟执行
以下函数可用于延迟服务器进程的执行:
pg_sleep(seconds)
pg_sleep_for(interval)
pg_sleep_until(timestamp with time zone)
pg_sleep使当前会话的进程休眠,直到*几秒钟过去。秒*是类型的值,因此可以指定秒的小数部分延迟。 是一个方便的功能,用于较大的睡眠时间指定为 . 是需要特定唤醒时间时的便利功能。例如:double precision``pg_sleep_for``interval``pg_sleep_until
SELECT pg_sleep(1.5);
SELECT pg_sleep_for('5 minutes');
SELECT pg_sleep_until('tomorrow 03:00');
注意
睡眠间隔的有效分辨率因平台而异;0.01 秒是一个常用值。睡眠延迟将至少与指定的一样长。它可能会更长,具体取决于服务器负载等因素。特别是,不能保证在指定时间准确唤醒,但它不会更早醒来。pg_sleep_until
警告
确保您的会话在调用或其变体时持有的锁不会超过必要的锁。否则,其他会话可能必须等待您的睡眠过程,从而减慢整个系统的速度。pg_sleep
[7]如果操作系统实现了闰秒,则为 60