生成一系列日期 - 使用日期类型作为输入

Posted

技术标签:

【中文标题】生成一系列日期 - 使用日期类型作为输入【英文标题】:Generate series of dates - using date type as input 【发布时间】:2014-01-29 12:29:04 【问题描述】:

Documentation for generate_series 表示参数可以是 intbigint for generate_series(start, stop)generate_series(start, stop, step) case 和 timestamptimestamp with time zone for generate_series(start, stop, step interval)

generate_series 也可以使用date 类型作为输入并返回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)

【问题讨论】:

请注意,我原来的解释有错误。几年过去了,但您可能仍然对更新感兴趣。 【参考方案1】:

感谢function type resolution,我们还可以将date 值传递给generate_series(),因为存在从datetimestamp 以及从date 到@ 的隐式转换987654331@。会模棱两可,但timestamptz 在“日期/时间类型”中是“首选”。详细解释:

Generating time series between two dates in PostgreSQL

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

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

Postgres 基本区分three types of casts:

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 表示 隐含在表达式中,以及其他情况。

我的大胆强调。

【讨论】:

以上是关于生成一系列日期 - 使用日期类型作为输入的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 8 日期作为逻辑类型的 Avro

作为获取谓词的日期范围 - 核心数据之间的 NSDate 谓词

如何使用输入类型 = 日期的 Html.TextBoxFor? [复制]

型号为“int”时,在Web上输入框作为“日期”(再次)

Razor 页面创建输入类型日期变成类型文本

使用简化方法在两个给定日期之间生成一系列日期