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

Sql 从Postgres中的日期提取工作日、毫秒、微秒、纳秒,sql,postgresql,datepart,Sql,Postgresql,Datepart,如何从Postgres中的日期中提取毫秒、工作日、微秒、纳秒。我也尝试过提取方法,但找不到完全相同的方法。,请查看表8-9.日期/时间类型“日期类型分辨率1天。因此,除了工作日,您无法获得上述任何信息: t=# select extract(Dow from now()::date); date_part ----------- 1 (1 row) 如果您查找的是日期缩写,而不是星期几编号: t=# select to_char(now()::date,'Dy'); to

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

,请查看表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)
有关更多详细信息,请参阅:

Dy-缩写的大写日名(英文为3个字符,本地化长度不同)


(格式化我的)

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

|日期部分| | :-------- | | 40500000 |
dbfiddle

我不确定您要找的是什么等效物,但是:

  • 在PostgreSQL中:对于
    时间戳
    间隔
    类型,允许的p(精度)范围为0到6
  • 一些日期部分包括其他部分:即
    毫秒
    包含
    微秒
    包含
    毫秒
    (因此也包含
如果要查找逻辑上独立的值,则需要进行一些计算,例如:

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
或者,如果要查看时间戳在其实际周内的距离,也可以使用
时间戳
(和
间隔
)算法:

select ts - date_trunc('week', ts) time_elapsed_since_monday
(虽然很难计算从周日开始的几周:
date\u trunc
仅适用于ISO周)


编辑您的问题,并提供样本数据和所需结果。我知道这是一个古老的答案,但您能否解释
to_char
方法中存在
Dy
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 |
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
select ts - date_trunc('week', ts) time_elapsed_since_monday