生成一系列date – 使用datetypes作为input
generate_series 文档说,对于generate_series(start, stop, step interval) ,参数可以是int或bigint用于generate_series(start, stop)和generate_series(start, stop, step)个案, timestamp或timestamp with time zone 。
generate_series与datetypes一起作为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。
timestamp和date 自动强制到timestamptz 。 在这个过程中假定当地时间为00:00 。
请注意,如果您使用timestamp或date作为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式中,以及其他情况。
大胆重视我的。