【问题标题】:Extract weekday, millisecond, microsecond, nanosecond from a date in Postgres从 Postgres 中的日期中提取工作日、毫秒、微秒、纳秒
【发布时间】:2017-10-29 16:13:55
【问题描述】:

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

【问题讨论】:

  • 编辑您的问题并提供示例数据和所需的结果。

标签: sql postgresql datepart


【解决方案1】:

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

  • PostgreSQL 中的there is no nanosecond precision允许的 p 范围(精度)timestampinterval 类型的范围是 0 到 6。
  • 一些日期部分包括其他部分:即milliseconds 包含secondsmicroseconds 包含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

【讨论】:

    【解决方案2】:

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

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

    dbfiddle here

    【讨论】:

      【解决方案3】:

      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 个字符,本地化长度不同)

      (格式化我的)

      【讨论】:

      • 我知道这是一个古老的答案,但你能解释一下Dyto_char 方法中的存在吗?
      猜你喜欢
      • 2022-06-13
      • 2014-10-12
      • 2015-04-21
      • 2019-08-01
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 2016-07-02
      • 2021-06-30
      相关资源
      最近更新 更多