【发布时间】:2017-10-29 16:13:55
【问题描述】:
如何从 Postgres 中的日期中提取毫秒、工作日、微秒、纳秒。我也尝试过提取方法,但找不到完全等效的方法。
【问题讨论】:
-
编辑您的问题并提供示例数据和所需的结果。
标签: sql postgresql datepart
如何从 Postgres 中的日期中提取毫秒、工作日、微秒、纳秒。我也尝试过提取方法,但找不到完全等效的方法。
【问题讨论】:
标签: sql postgresql datepart
我不确定您在寻找什么等价物,但是:
timestamp 和 interval 类型的范围是 0 到 6。
milliseconds 包含seconds 和microseconds 包含milliseconds(因此也包含seconds)。如果您正在寻找逻辑上独立的值,则需要进行一些数学运算,例如:
select extract(dow from ts) dow, -- day-of-week (where weeks start on sunday, which is 0)
extract(isodow from ts) isodow, -- ISO day-of-week (where weeks start on monday, which is 1)
floor(extract(seconds from ts))::int only_seconds,
floor(extract(milliseconds from ts))::int - 1000 * floor(extract(seconds from ts))::int only_milliseconds,
floor(extract(microseconds from ts))::int - 1000 * floor(extract(milliseconds from ts))::int only_microseconds,
extract(microseconds from ts) all_microseconds
或者,如果您要查看时间戳在其实际一周内的距离,您也可以使用 timestamp(和 interval)算术:
select ts - date_trunc('week', ts) time_elapsed_since_monday
(虽然从星期天开始计算这个星期相当困难:date_trunc 仅适用于 ISO 星期)。
【讨论】:
据我所知,Postgres 不支持纳秒。其余的:
|日期部分 | | :-------- | | 5 |select extract(dow from timestamp '2001-02-16 20:38:40.5');
|日期部分 | | :-------- | | 40500 |select extract(milliseconds from timestamp '2001-02-16 20:38:40.5');
|日期部分 | | :-------- | | 40500000 |select extract(microseconds from timestamp '2001-02-16 20:38:40.5');
dbfiddle here
【讨论】:
https://www.postgresql.org/docs/current/static/datatype-datetime.html,查看“表 8-9. 日期/时间类型” 日期类型分辨率1 天。所以你不能得到以上任何一个,但工作日:
t=# select extract(Dow from now()::date);
date_part
-----------
1
(1 row)
如果您要查找日期的缩写,而不是星期几:
t=# select to_char(now()::date,'Dy');
to_char
---------
Mon
(1 row)
更多详情请看docs:
Dy - 缩写大写的日期名称(英文 3 个字符,本地化长度不同)
(格式化我的)
【讨论】:
Dy 在to_char 方法中的存在吗?