如何编写 SQL 将 XML 文件读入 PostgreSQLXML
值?
PostgreSQL 有一个原生XML 数据类型,它具有XMLPARSE
将文本字符串解析为该类型的功能。它还有从文件系统读取数据的方法;COPY
声明等。
但是我没有看到一种方法来编写本机 PostgreSQL SQL 语句来从文件系统条目中读取内容并使用它来填充一个XML
值。我怎样才能做到这一点?
如何在 PostgreSQL 类型中以降低的精度存储日期和时间值,并让它们表现为日期和/或时间值?
ISO 8601 允许降低精度的日期值。'1964', '1964-05', '1964-05-02' 都是值的有效表示,提高精度。Python 'datetime' 类型也允许以这种方式降低精度的值。
在本机日期类型中,日期的每个元素都必须存在,否则该值将被拒绝。将低于所需精度级别的元素设置为“00”也会失败。
=> SELECT CAST('1964-05-02' AS DATE);
date
------------
1964-05-02
(1 row)
=> SELECT CAST('1964-05' AS DATE);
ERROR: invalid input syntax for type date: "1964-05"
LINE 1: SELECT CAST('1964-05' AS DATE);
^
=> SELECT CAST('1964' AS DATE);
ERROR: invalid input syntax for type date: "1964"
LINE 1: SELECT CAST('1964' AS DATE);
^
=> SELECT CAST('1964-00-00' AS DATE);
ERROR: date/time field value out of range: "1964-00-00"
LINE 1: SELECT CAST('1964-00-00' AS DATE);
^
HINT: Perhaps you need a different "datestyle" setting.
是否有一种简单、标准的方法来支持将精度降低的 ISO 8601 日期值输入 PostgreSQL 日期和/或时间类型?
为此创建一个类型是可能的,但我不知道如何。当然,我需要对值进行范围检查并处理时区,并与其他时间值进行明智的比较,这是内置类型所做的所有其他有用的事情。
我期望的是,正如值 '1964-05-02' 指的是当天 00:00:00 到第二天 00:00:00 之间的整个间隔,降低精度的值将仅表示较大的间隔:“1962-05”是指从 1962 年 5 月初的 00:00:00 到 1962 年 6 月的第一天 00:00:00 之间的整个间隔。
我想看到的一个例子:
=> SELECT CAST('1964-05-02 00:00' AS TIMESTAMP) = CAST('1964-05-02 00:00:00' AS TIMESTAMP);
?column?
----------
t
(1 row)
=> SELECT CAST('1964-05' AS TIMESTAMP) = CAST('1964-05-02' AS TIMESTAMP);
?column?
----------
t
(1 row)
目前前者的行为如上;后者抱怨“类型时间戳的输入语法无效”。在我看来,与更精细的值相比,它们都是降低精度值的表现。
1964-05
ISO 8601 中的含义包括更精确的值1964-05-02
和1964-05-02 18:27
和1964-05-23
。所以这些都应该比较相等。