Orcle用户表统计最近12个月每个月的创建数量含本月

本文介绍了一种在Oracle数据库中查询用户表的方法,旨在统计最近12个月的用户注册数量,包括当前月份。通过使用SQL语句,结合to_char和add_months函数,能够精确获取每个月份的注册用户数,为业务分析提供数据支持。

Orcle用户表统计最近12个月的每个月创建数量含本月
一、场景需求
想在数据库中用户表中查出最近12个月的用户注册数,查出的字段要有:创建年月year-month、数量count
二、准备所需
Orcle数据库(mysql应该也可以暂时还没试)test,
用户表user
表字段:id,name,createtime(仅测试字段)
三、sql语句
select
count(1) as cnt,
to_char(t.createtime, ‘yyyy-mm’) as year_month
from
test.user t
where
to_char(t.createtime, ‘yyyy-mm’)=to_char(add_months(sysdate, 0), ‘yyyy-mm’)
group by
to_char(t.createtime, ‘yyyy-mm’)

	UNION

	select
	count(1) as cnt,
	to_char(t.createtime, 'yyyy-mm') as year_month
	from
	test.user t
	where
	to_char(t.createtime, 'yyyy-mm')=to_char(add_months(sysdate, -1), 'yyyy-mm')
	group by
	to_char(t.createtime, 'yyyy-mm')

	UNION

	select
	count(1) as cnt,
	to_char(t.createtime, 'yyyy-mm') as year_month
	from
	test.user t
	where
	to_char(t.createtime, 'yyyy-mm')=to_char(add_months(sysdate, -2), 'yyyy-mm')
	group by
	to_char(t.createtime, 'yyyy-mm')

	UNION

	select
	count(1) as cnt,
	to_char(t.createtime, 'yyyy-mm') as year_month
	from
	test.user t
	where
	to_char(t.createtime, 'yyyy-mm')=to_char(add_months(sysdate, -3), 'yyyy-mm')
	group by
	to_char(t.createtime, 'yyyy-mm')

	UNION

	select
	count(1) as cnt,
	to_char(t.createtime, 'yyyy-mm') as year_month
	from
	test.user t
	where
	to_char(t.createtime, 'yyyy-mm')=to_char(add_months(sysdate, -4), 'yyyy-mm')
	group by
	to_char(t.createtime, 'yyyy-mm')

	UNION

	select
	count(1),
	to_char(t.createtime, 'yyyy-mm') as year_month
	from
	test.user t
	where
	to_char(t.createtime, 'yyyy-mm')=to_char(add_months(sysdate, -5), 'yyyy-mm')
	group by
	to_char(t.createtime, 'yyyy-mm')

	UNION

	select
	count(1) as cnt,
	to_char(t.createtime, 'yyyy-mm') as year_month
	from
	test.user t
	where
	to_char(t.createtime, 'yyyy-mm')=to_char(add_months(sysdate, -6), 'yyyy-mm')
	group by
	to_char(t.createtime, 'yyyy-mm')

	UNION

	select
	count(1) as cnt,
	to_char(t.createtime, 'yyyy-mm') as year_month
	from
	test.user t
	where
	to_char(t.createtime, 'yyyy-mm')=to_char(add_months(sysdate, -7), 'yyyy-mm')
	group by
	to_char(t.createtime, 'yyyy-mm')

	UNION

	select
	count(1) as cnt,
	to_char(t.createtime, 'yyyy-mm') as year_month
	from
	test.user t
	where
	to_char(t.createtime, 'yyyy-mm')=to_char(add_months(sysdate, -8), 'yyyy-mm')
	group by
	to_char(t.createtime, 'yyyy-mm')

	UNION

	select
	count(1) as cnt,
	to_char(t.createtime, 'yyyy-mm') as year_month
	from
	test.user t
	where
	to_char(t.createtime, 'yyyy-mm')=to_char(add_months(sysdate, -9), 'yyyy-mm')
	group by
	to_char(t.createtime, 'yyyy-mm')

	UNION

	select
	count(1) as cnt,
	to_char(t.createtime, 'yyyy-mm') as year_month
	from
	test.user t
	where
	to_char(t.createtime, 'yyyy-mm')=to_char(add_months(sysdate, -10), 'yyyy-mm')
	group by
	to_char(t.createtime, 'yyyy-mm')

	UNION

	select
	count(1) as cnt,
	to_char(t.createtime, 'yyyy-mm') as year_month
	from
	test.user t
	where
	to_char(t.createtime, 'yyyy-mm')=to_char(add_months(sysdate, -11), 'yyyy-mm')
	group by
	to_char(t.createtime, 'yyyy-mm')
	UNION

	select
	count(1) as cnt,
	to_char(t.createtime, 'yyyy-mm') as year_month
	from
	test.user t
	where
	to_char(t.createtime, 'yyyy-mm')=to_char(add_months(sysdate, -12), 'yyyy-mm')
	group by
	to_char(t.createtime, 'yyyy-mm')

四、显示结果
在这里插入图片描述

### Oracle 获取前三个时间区间的 SQL 方法 在 Oracle 数据库中,可以通过 `SYSDATE` 和日期函数来动态计算前几个的时间区间。以下是具体的实现方法: #### 使用 `ADD_MONTHS` 函数 可以利用 `ADD_MONTHS` 函数向前推算三个的起始时间和结束时间。 ```sql SELECT ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -3) AS start_date, TRUNC(SYSDATE, 'MM') - INTERVAL '1' DAY AS end_date FROM dual; ``` - **解释**: - `TRUNC(SYSDATE, 'MM')`: 将当前日期截断为当的第一天[^5]。 - `ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -3)`: 计算前三个第一天的日期[^4]。 - `INTERVAL '1' DAY`: 表示一天的时间间隔,用于调整结束时间为上一个的最后一秒[^5]。 此查询返回的结果将是: - 起始日期:前三个的第一天。 - 结束日期:当前份前一天的最后时刻。 --- #### 动态生成前三个的所有日期 如果需要获取前三个内每一天的具体日期,则可以扩展如下: ```sql WITH dates AS ( SELECT ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -3) + LEVEL - 1 AS date_column FROM dual CONNECT BY LEVEL <= EXTRACT(DAY FROM LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -3))) ) SELECT * FROM dates; ``` - **解释**: - `CONNECT BY LEVEL`: 构建递归序列,逐日增加日期[^5]。 - `EXTRACT(DAY FROM LAST_DAY(...))`: 提取目标份的最大天数。 该查询会列出从前三个的第一天到最后一天的所有具体日期。 --- #### 基于特定日期范围的查询 如果有固定的时间段需求(而非基于当前日期),则可以直接替换 `SYSDATE` 为指定日期。例如,假设需要查询从 `"2023-10-01"` 到其前三个之间的日期范围: ```sql SELECT ADD_MONTHS(TRUNC(TO_DATE('2023-10-01', 'YYYY-MM-DD'), 'MM'), -3) AS start_date, TRUNC(TO_DATE('2023-10-01', 'YYYY-MM-DD'), 'MM') - INTERVAL '1' DAY AS end_date FROM dual; ``` 这将返回固定的前三个时间区间。 --- #### Python Pandas 中的应用场景 如果需要通过 Python 的 Pandas 库结合 cx_Oracle 来执行类似的查询,可以参考以下代码片段[^2]: ```python import pandas as pd import cx_Oracle connection = cx_Oracle.connect("username/password@hostname:port/service_name") query = """ SELECT ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -3) AS start_date, TRUNC(SYSDATE, 'MM') - INTERVAL '1' DAY AS end_date FROM dual """ df = pd.read_sql(query, connection) print(df) ``` 这段代码能够直接读取并展示前三个的时间区间。 --- ### 总结 以上提供了多种方式来解决 Oracle 数据库中获取前三个时间区间的问题。无论是静态还是动态查询,都可以灵活应用这些技术方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值