postgresql查询今天、昨天、本周、本月、上月、今年、去年的时间以及计算时间之差

 更新时间:2024年08月14日 11:05:47   作者:我叫yeeking啊  
PostgreSQL提供了许多返回当前日期和时间的函数,下面这篇文章主要给大家介绍了关于postgresql查询今天、昨天、本周、本月、上月、今年、去年的时间以及计算时间之差的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在项目遇到一个需求是查询统计今天、昨天、本周、本月、上月、今年、去年的时间数据,最近一个月的,最近一年的月份数据,使用的是pgSql数据库:

获取当前系统时间

select now();
select current_timestamp;
结果:2020-11-04 16:09:53.247825+08

获取当前日期或时间

select current_date;
结果:2020-11-04
select current_time;
结果:16:14:08.501182+08

查询昨天的数据

select 
	DISTINCT count(id)
from 
	表名
where coalesce(l.join_date,l.sys_createdate) >= current_date - 1;

# 这里的coalesce函数,语法:coalesce(expr1,expr2,expr3...)
# 如果第一个字段存在就用第一个进行表达式判断;
# 如果第一个不存在为null则用第二个进行表达式判断;
# 如果都没有null则返回null

查询某个时间的周一

SELECT ( DATE '2020-10-23' - INTERVAL '1 day' - ( EXTRACT ( dow FROM ( DATE'2020-10-23' - INTERVAL '1 day' ) ) - 1 || ' day' ) :: INTERVAL ) :: DATE;
# 减1 是因为得到的是以周一是星期的开始

查询本周的数据

SELECT( DATE ( now() ) - ( EXTRACT ( dow FROM DATE ( now() ) ) - 1 || ' day' ) :: INTERVAL ) :: DATE startasy,
( DATE ( now() ) - ( EXTRACT ( dow FROM DATE ( now() ) ) - 1 || ' day' ) :: INTERVAL ) :: DATE + 6 endday
	from 表名 LIMIT 1;

本周最后一天

SELECT to_char(CURRENT_DATE +cast(-1*(TO_NUMBER(to_char(CURRENT_DATE,'D'),'99')-2) + 6 ||' days' as interval),'yyyy-mm-dd');
# 加6天就表示是周日 不加就是本周的第一天

本月,方式一

select to_char((SELECT now() as timestamp),'mm');

本月,方式二

select * from 表名 where time >= date_trunc( 'month', now() ); 

获取上月

select to_char((select  now() - interval '1 month'),'mm');

获取今年

select to_char((SELECT now() as timestamp),'yyyy')

获取去年

select to_char((select  now() - interval '1 years'),'yyyy')

(补充)获取过去12个月或者今年月份的数据

WITH RECURSIVE T (n) AS (
SELECT DATE(to_char( to_date('2022-08', 'yyyy-MM-dd') - INTERVAL '11 month', 'yyyy-MM-dd' ))
UNION ALL
SELECT
n + 1
FROM
T
WHERE
n < DATE( to_char( to_date('2022-08', 'yyyy-MM-dd'), 'yyyy-MM-dd' ) )
) SELECT
to_char( n, 'yyyy-MM' ) AS MONTH
FROM T
GROUP BY
MONTH ORDER BY Month
# 只要月份修改成2022-12就表示查询今年内的所有月份

(补充)获取过去一个月内的所有天的数据

WITH RECURSIVE T ( n ) AS (
SELECT DATE
( to_char( now( ) - INTERVAL '30 day', 'yyyy-MM-dd' ) ) UNION ALL
SELECT
n + 1
FROM
T
WHERE
n < DATE ( to_char( now( ), 'yyyy-MM-dd' ) )
) SELECT
to_char( n, 'yyyy-MM-dd' ) AS DAYS
FROM T
GROUP BY
DAYS
ORDER BY DAYS

(补充)获取上个月每天的数据(1号-31号)

SELECT
 generate_series (
  date_trunc( 'month', CURRENT_DATE - interval '1 month'),
  date_trunc( 'month', CURRENT_DATE) - interval '1 day',
  '1 d' :: INTERVAL
 ) :: DATE days

(补充)获取本月每天的数据(1号-31号)

SELECT
 generate_series (
  date_trunc( 'month', CURRENT_DATE),
  date_trunc( 'month', CURRENT_DATE)  + '1 month -1d',
  '1 d' :: INTERVAL
 ) :: DATE days

(补充)获取某一天24小时的时刻

 select to_char(t,'yyyy-MM-DD HH24') as day
 from 
 generate_series('2022-01-01 00:00:00'::DATE,'2022-01-01 23:00:00', '1 hours') as t order by day asc;

或者这样写(方便传参):获取某一天24小时的时刻

SELECT
	to_char( T, 'yyyy-mm-dd HH24' ) AS HOUR 
FROM
	generate_series ( to_date( '2022-01-01', 'yyyy-MM-dd HH24:mi:ss' ), to_timestamp( concat ( '2022-01-01', ' 23:00:00' ), 'yyyy-mm-dd HH24:mi:ss' ), '1 hours' ) AS T 
ORDER BY
HOUR ASC;

同理,可获取某个月的所有天数据

SELECT
		to_char( T, 'yyyy-mm-dd' ) AS day
FROM
		generate_series ( to_date('2022-11', 'yyyy-MM'), (date_trunc('month', to_date('2022-11', 'yyyy-MM')) + interval '1 month - 1 day')::date, '1 days' ) AS T

同理,可获取某年的所有月份数据(上面写过相似的方法)

SELECT
	to_char( T, 'yyyy-MM' ) AS MONTH 
FROM
	generate_series ( to_date( concat ( '2022', '-01-01' ), 'yyyy-MM-dd' ), to_date( concat ( '2022', '-12-31' ), 'yyyy-MM-dd' ), '1 month' ) AS T 
ORDER BY
MONTH ASC

获取时间之间的秒差

SELECT round(date_part('epoch', TIMESTAMP '2022-08-15 17:00:10' - TIMESTAMP '2022-08-15 17:00:00'));
结果:10

获取时间之间的分钟差

SELECT round(date_part('epoch', TIMESTAMP '2022-08-15 17:10:10' - TIMESTAMP '2022-08-15 17:00:00')/60);
结果:10

获取时间之间的小时差

SELECT round(date_part('epoch', TIMESTAMP '2022-08-15 19:10:10' - TIMESTAMP '2022-08-15 17:00:00')/60/60);
结果:2

总结 

到此这篇关于postgresql查询今天、昨天、本周、本月、上月、今年、去年的时间以及计算时间之差的文章就介绍到这了,更多相关pgSql查询时间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PostgreSQL 实现将多行合并转为列

    PostgreSQL 实现将多行合并转为列

    这篇文章主要介绍了PostgreSQL 实现将多行合并转为列的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 在postgresql数据库中创建只读用户的操作

    在postgresql数据库中创建只读用户的操作

    这篇文章主要介绍了在postgresql数据库中创建只读用户的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • PostgreSQL的 archive_mode 参数配置示例详解

    PostgreSQL的 archive_mode 参数配置示例详解

    本文详细介绍了PostgreSQL的archive_mode参数,包括其三个选项(off、on、always)的对比和使用场景,以及在不同模式下的配置和行为特点,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • PostgreSQL 删除check约束的实现

    PostgreSQL 删除check约束的实现

    这篇文章主要介绍了PostgreSQL 删除check约束的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 详解PostgreSql数据库对象信息及应用

    详解PostgreSql数据库对象信息及应用

    这篇文章主要介绍了PostgreSql数据库对象信息及应用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • PostgreSQL表名超长踩坑记

    PostgreSQL表名超长踩坑记

    本文介绍了PostgreSQL表名最长长度为63个字符,而非常见的256或512个字符,并以删除过期日志表为例,详细描述了表名被截断执行导致误删的问题及其解决方法
    2026-05-05
  • PostgreSQL建立自增主键的2种方法总结

    PostgreSQL建立自增主键的2种方法总结

    这篇文章主要给大家介绍了关于PostgreSQL建立自增主键的2种方法,PostgreSQL主键自增是一种自动增长的机制,可以为表中的每一行记录分配唯一的标识符,需要的朋友可以参考下
    2023-09-09
  • 使用PostgreSQL数据库建立用户画像系统的方法

    使用PostgreSQL数据库建立用户画像系统的方法

    这篇文章主要介绍了使用PostgreSQL数据库建立用户画像系统,下面使用一个具体的例子来说明如何使用PostgreSQL的json数据类型来建立用户标签数据,需要的朋友可以参考下
    2022-10-10
  • 在PostgreSQL中实现数据的自动清理和过期清理

    在PostgreSQL中实现数据的自动清理和过期清理

    在 PostgreSQL 中,可以通过多种方式实现数据的自动清理和过期处理,以确保数据库不会因为存储过多过时或不再需要的数据而导致性能下降和存储空间浪费,本文给大家介绍了一些常见的方法及详细示例,需要的朋友可以参考下
    2024-07-07
  • postgresql中时间转换和加减操作

    postgresql中时间转换和加减操作

    这篇文章主要介绍了postgresql中时间转换和加减操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论