这是很容易证明,许多日期/时间格式等比下面的两个很容易受到由于设置语言,SET DATEFORMAT,或登录的默认语言误解:
yyyyMMdd -- unseparated, date only
yyyy-MM-ddThh:mm:ss.fff -- date dash separated, date/time separated by T
Run Code Online (Sandbox Code Playgroud)
即使这种没有 T 的格式也可能看起来像一个有效的 ISO 8601 格式,但它在多种语言中都失败了:
DECLARE @d varchar(32) = '2017-03-13 23:22:21.020';
SET LANGUAGE Deutsch;
SELECT CONVERT(datetime, @d);
SET LANGUAGE Français;
SELECT CONVERT(datetime, @d);
Run Code Online (Sandbox Code Playgroud)
结果:
Die Spracheneinstellung wurde auf Deutsch geändert。
Msg 242, Level 16, State 3
Bei der Konvertierung eines varchar-Datentyps in einen datetime-Datentyp liegt der Wert außerhalb des gültigen Bereichs。
Le paramètre de langue est passé à Français。 …
SELECT json_array_elements('["one", "two"]'::json)
Run Code Online (Sandbox Code Playgroud)
给出结果
| json_array_elements | | :------------------ | | “一个” | | “两个” |
我想要相同但没有引号:
one
two
Run Code Online (Sandbox Code Playgroud)
看起来我不能->>
在这里使用,因为我在 JSON 中没有字段名称。它只是一个字符串数组。
Postgres 版本:PostgreSQL 10.0 on x86_64-apple-darwin,由 i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (基于 Apple Inc. build 5658) (LLVM build 2336.11.00) 编译,64-少量
如何索引to_char()
列的 a ?
我试过了:
adam_db=> CREATE INDEX updates_hourly_idx
ON updates (to_char(update_time, 'YYYY-MM-DD HH24:00'));
Run Code Online (Sandbox Code Playgroud)
但是得到了错误:
错误:必须标记索引表达式中的函数
IMMUTABLE
这看起来很奇怪,因为to_char()
时间戳是相当不可变的。
任何想法如何生成该索引?
当我使用099
指示 0 填充的 3 位数字时,我会在左侧得到空格。
SELECT '>' || to_char(1, '099') || '<';
?column?
----------
> 001<
(1 row)
Run Code Online (Sandbox Code Playgroud)
为什么to_char
这里是左填充?为什么会有前导空格?