PostgreSQL中的日期/时间函数详解

bangongJIAO1@c 发布于 2025-11-29 阅读(2)
目录
  • 零、前言
  • 一、获取当前时间
  • 二、时间的加减
  • 三、格式化函数
    • 3.1时间转字符串
    • 3.2字符串转日期
    • 3.3字符串转时间
    • 3.4Unix时间戳转时间
  • 四、一些重要函数
    • 4.1时间间隔
    • 4.2时间截取
  • 五、时间的转换
    • 六、收!

      零、前言

      公司里有一台阿里云RDS数据库用了PPAS(Postgres PlusTM Advanced Server),在处理日期/时间时遇到一些问题,花了点时间整理如下。

      一、获取当前时间

      • select now()
      • select current_timestamp
      • select localtimestamp
      • select clock_timestamp()

      PostgreSQL中的日期/时间函数详解

      有时候,我们不需要这么完整细致的时间,自然就有

      • select current_date
      • select current_time
      • select localtime

      PostgreSQL中的日期/时间函数详解

      二、时间的加减

      老实说,这是见过最奇怪的一套时间计算的方式了。

      select now() + interval '2 years';
      select now() + interval '2 year'; 
      select now() + interval '2 y';
      select now() + interval '2 Y';
      select now() + interval '2Y';

      结果都是一样的:

      PostgreSQL中的日期/时间函数详解

      interval部分可以不写,以此类推,月、日、小时、分钟、秒的加减计算也同理。

      Abbreviation Meaning
      Y Years
      M Months (in the date part)
      W Weeks
      D Days
      H Hours
      M Minutes (in the time part)
      S Seconds

      值得一提的是单写M会默认为分钟的加减,针对月的加减建议写完整的month或months或者简写mon。

      三、格式化函数

      3.1时间转字符串

      to_char(timestamp,text)

      PostgreSQL中的日期/时间函数详解

      3.2字符串转日期

      to_date(text,text)

      PostgreSQL中的日期/时间函数详解

      3.3字符串转时间

      to_timestamp(text,text)

      PostgreSQL中的日期/时间函数详解

      3.4Unix时间戳转时间

      to_timestamp(unixtime)

      PostgreSQL中的日期/时间函数详解

      关于时间格式的模式,丢表跑:

      模式 描述
      HH 一天的小时数(01-12)
      HH12 一天的小时数(01-12)
      HH24 一天的小时数(00-23)
      MI 分钟(00-59)
      SS 秒(00-59)
      MS 毫秒(000-999)
      US 微秒(000000-999999)
      AM 正午标识(大写)
      Y,YYY 带逗号的年(4和更多位)
      YYYY 年(4和更多位)
      YYY 年的后三位
      YY 年的后两位
      Y 年的最后一位
      MONTH 全长大写月份名(空白填充为9字符)
      Month 全长混合大小写月份名(空白填充为9字符)
      month 全长小写月份名(空白填充为9字符)
      MON 大写缩写月份名(3字符)
      Mon 缩写混合大小写月份名(3字符)
      mon 小写缩写月份名(3字符)
      MM 月份号(01-12)
      DAY 全长大写日期名(空白填充为9字符)
      Day 全长混合大小写日期名(空白填充为9字符)
      day 全长小写日期名(空白填充为9字符)
      DY 缩写大写日期名(3字符)
      Dy 缩写混合大小写日期名(3字符)
      dy 缩写小写日期名(3字符)
      DDD 一年里的日子(001-366)
      DD 一个月里的日子(01-31)
      D 一周里的日子(1-7;周日是1)
      W 一个月里的周数(1-5)(第一周从该月第一天开始)
      WW 一年里的周数(1-53)(第一周从该年的第一天开始)

      四、一些重要函数

      4.1时间间隔

      age(timestamp, timestamp)

      当然也可以只输入一个参数,计算current_date与入参的时间间隔。

      PostgreSQL中的日期/时间函数详解

      4.2时间截取

      date_part(text, timestamp)
      extract(field from timestamp)

      PostgreSQL中的日期/时间函数详解

      还可以截断至指定精度

      date_trunc(text, timestamp)

      PostgreSQL中的日期/时间函数详解

      如图所示,小时后的分和秒被置为0。

      五、时间的转换

      select timestamp '2012-05-12 18:54:54';  --2012-05-12 18:54:54
      select date '2012-05-12 18:54:54';       --2012-05-12
      select time  '2012-05-12 18:54:54';      --18:54:54
      select TIMESTAMP WITH TIME ZONE '2012-05-12 18:54:54'   
      --2012-05-12 18:54:54+08
      
      --与unix时间戳的转换
      SELECT TIMESTAMP 'epoch' + 1341174767 * INTERVAL '1 second'; 
      --2012-07-01 20:32:47

      六、收!