从 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(精度)的允许范围 对于
timestamp
和 interval
类型.
- 一些日期部分包括其他部分:即
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 中的日期中提取毫秒、工作日、微秒、纳秒。我也尝试过提取方法,但找不到完全相同的方法。
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(精度)的允许范围 对于
timestamp
和interval
类型. - 一些日期部分包括其他部分:即
milliseconds
包含seconds
µseconds
包含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 周)。