生成一系列date – 使用datetypes作为input

generate_series 文档说,对于generate_series(start, stop, step interval) ,参数可以是intbigint用于generate_series(start, stop)generate_series(start, stop, step)个案, timestamptimestamp with time zone

generate_seriesdatetypes一起作为input并返回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) 

generate_series()的第二种forms总是返回timestamptz ,并且始终将timestamptz作为input。

timestampdate 自动强制timestamptz 。 在这个过程中假定当地时间为00:00

请注意,如果您使用timestampdate作为input,则当前时区设置将直接影响结果,因为显然,“2014-01-10 00:00”在Tokio中表示的时间点与在纽约的时间点不同。

Postgres如何决定哪些types可以接受?

Postgres基本上区分三种types的演员 。

Explicit casts ..当使用CAST::语法。
Assignment cast ..赋值给目标列时隐式转换。
Implicit cast式转换..隐式转换所有其他expression式。

在系统中必须有一个从inputtypes到期望types的隐式强制types转换,才能使一个函数静静地接受(并转换)一个input值。

要查看哪些转换定义 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隐含在expression式中,以及其他情况。

大胆重视我的。