生成一系列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
与date
types一起作为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式中,以及其他情况。
大胆重视我的。