从 Postgres 中的日期中提取工作日、毫秒、微秒、纳秒

Extract weekday, millisecond, microsecond, nanosecond from a date in Postgres

如何从 Postgres 中的日期中提取毫秒、工作日、微秒、纳秒。我也尝试过提取方法,但找不到完全相同的方法。

https://www.postgresql.org/docs/current/static/datatype-datetime.html,查看"Table 8-9. Date/Time Types"日期类型解析1天[=​​25=]。所以你不能得到上面的none,但是工作日:

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 - abbreviated capitalized day name (3 chars in English, localized lengths vary)

(格式化我的)

据我所知,Postgres 不支持纳秒。其余:

select extract(dow from timestamp '2001-02-16 20:38:40.5');
| date_part |
| :-------- |
| 5         |
select extract(milliseconds from timestamp '2001-02-16 20:38:40.5');
| date_part |
| :-------- |
| 40500     |
select extract(microseconds from timestamp '2001-02-16 20:38:40.5');
| date_part |
| :-------- |
| 40500000  |

dbfiddle here

我不确定您在寻找什么等价物,但是:

  • there is no nanosecond precision 在 PostgreSQL 中:p(精度)的允许范围 对于 timestampinterval 类型.
  • 一些日期部分包括其他部分:即 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 周)。

http://rextester.com/SOOO48159