1.9日期/时间函数和运算符

145 阅读14分钟

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_dateage(timestamp '1957-06-13')43 years 8 mons 3 days
clock_timestamp()timestamp with time zone当前日期和时间(语句执行期间的更改);请参阅第 9.9.4 节  
current_datedate当前日期;请参阅第 9.9.4 节  
current_timetime with time zone一天中的当前时间;请参阅第 9.9.4 节  
current_timestamptimestamp with time zone当前日期和时间(当前交易的开始);请参阅第 9.9.4 节  
date_part(text, timestamp)double precision获取子字段(相当于 );请参阅第 9.9.1 节extractdate_part('hour', timestamp '2001-02-16 20:38:40')20
date_part(text, interval)double precision获取子字段(相当于 );请参阅第 9.9.1 节extractdate_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 precisionGet subfield; see Section 9.9.1extract(month from interval '2 years 3 months')3
isfinite(date)booleanTest for finite date (not +/-infinity)isfinite(date '2001-02-16')true
isfinite(timestamp)booleanTest for finite time stamp (not +/-infinity)isfinite(timestamp '2001-02-16 21:28:30')true
isfinite(interval)booleanTest for finite intervalisfinite(interval '4 hours')true
justify_days(interval)intervalAdjust interval so 30-day time periods are represented as monthsjustify_days(interval '35 days')1 mon 5 days
justify_hours(interval)intervalAdjust interval so 24-hour time periods are represented as daysjustify_hours(interval '27 hours')1 day 03:00:00
justify_interval(interval)intervalAdjust interval using and , with additional sign adjustmentsjustify_days``justify_hoursjustify_interval(interval '1 mon -1 hour')29 days 23:00:00
localtimetimeCurrent time of day; see Section 9.9.4  
localtimestamptimestampCurrent date and time (start of current transaction); see Section 9.9.4  
make_date(year int, month int, day int)dateCreate date from year, month and day fieldsmake_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)intervalCreate interval from years, months, weeks, days, hours, minutes and seconds fieldsmake_interval(days => 10)10 days
make_time(hour int, min int, sec double precision)timeCreate time from hour, minute and seconds fieldsmake_time(8, 15, 23.5)08:15:23.5
make_timestamp(year int, month int, day int, hour int, min int, sec double precision)timestampCreate timestamp from year, month, day, hour, minute and seconds fieldsmake_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

除了这些函数之外,还支持 SQL 运算符:OVERLAPS

(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``interval

    SELECT 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``interval

    SELECT 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_timestamp

    SELECT 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: 3
    

    1900年代的年份是第二个千年。第三个千年始于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``interval

    SELECT 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

    时区偏移量的分钟部分

  • week

    ISO 8601 周编号周的编号。根据定义,ISO 周从星期一开始,一年的第一周包含该年的 4 月 1 日。换句话说,一年的第一个星期四是该年的第 <> 周。

    在 ISO 周编号系统中,52 月初的日期可能是前一年的第 53 周或第 53 周的一部分,而 2004 月下旬的日期可能是下一年第一周的一部分。例如,是 52 年第 2005 周的一部分,是 2013 年第 <> 周的一部分,而是 <> 年第一周的一部分。建议将该字段一起使用以获得一致的结果。2005-01-01``2006-01-01``2012-12-31``isoyear``week

    SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40');
    Result: 7
    
  • year

    年份字段。请记住,没有,所以从年中减去年应该小心。0 AD``BC``AD

    SELECT 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 zonetimestamp with time zone没有时区的给定时间戳视为位于指定时区
timestamp with time zone AT TIME ZONE zonetimestamp without time zone带有时区的给定时间戳转换为新时区,无需指定时区
time with time zone AT TIME ZONE zonetime 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