4

文档forgenerate_series说参数可以是intor bigintforgenerate_series(start, stop)generate_series(start, stop, step)case 和timestampor timestamp with time zonefor generate_series(start, stop, step interval)

generate_seriesdate类型作为输入并返回的原因是什么timestamp with timezone

pg=# select generate_series('2014-01-01'::date,'2014-01-02'::date,'1 day');
    generate_series     
------------------------
 2014-01-01 00:00:00+01
 2014-01-02 00:00:00+01
(2 rows)
4

1 回答 1

8

由于函数类型解析,我们还可以将date值传递给, 因为from to和 from togenerate_series()都有隐式转换。会模棱两可,但在“日期/时间类型”中是“首选”。详细解释:datetimestampdatetimestamptztimestamptz

演员表中假定了date当地时间。00:00请注意,如果您将date其用作输入,则当前时区设置会直接影响结果,因为显然,“2014-01-10 00:00”在 Tokio 中代表的时间点与在纽约的时间点不同。

Postgres 如何决定可接受的类型?

Postgres 基本上区分了三种类型的演员表

Explicit casts.. 使用CAST::语法时。
Assignment cast.. 将值分配给目标列时的隐式转换。
Implicit cast.. 所有其他表达式中的隐式强制转换。

必须在系统中注册从输入类型到预期类型的​​隐式转换,以使函数静默接受(并转换)输入值。

要查看定义 timestamptz哪些演员表,您可以查询目录表pg_cast

SELECT castsource::regtype, casttarget::regtype, castcontext
FROM   pg_cast
WHERE  casttarget = 'timestamptz'::regtype;

         castsource          |        casttarget        | castcontext
-----------------------------+--------------------------+-------------
 abstime                     | timestamp with time zone | i
 date                        | timestamp with time zone | i
 timestamp without time zone | timestamp with time zone | i
 timestamp with time zone    | timestamp with time zone | i

所有这些强制转换都是隐式的。每个文档castcontext

指示可以在哪些上下文中调用强制转换。e仅表示作为显式强制转换(使用CAST::语法)。a意味着隐含地分配给目标列,以及显式地。i隐含在表达式中,以及其他情况。

大胆强调我的。

于 2014-01-10T18:00:10.547 回答