SQL查询今天、昨天、本周、上周、本月、上月数据

本文介绍了如何使用MYSQL和Oracle数据库的SQL查询来获取今天、昨天、本周、上周、本月和上月的数据。在MYSQL中,主要利用DATEDIFF函数结合NOW()进行筛选;而在Oracle中,通过TO_CHAR和相关日期函数如SYSDATE、TRUNC、NEXT_DAY等实现日期范围的查询。示例查询包括了不同时间段的数据计数方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MYSQL数据库:

查询当天的所有数据

SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW())=0

 

查询昨天的所有数据

SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW())=-1

 

查询未来第n天的所有数据

//当n为负数时,表示过去第n天的数据

SELECT * FROM 表名WHERE DATEDIFF(字段,NOW())=n

 

查询未来n天内所有数据

//n天内

SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW())<n AND DATEDIFF(字段,NOW())>=0

 

查询过去n天内所有数据

//包含当天

SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW())<=0 AND DATEDIFF(字段,NOW())>-n

//不包含当天

SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW())<0 AND DATEDIFF(字段,NOW())>-n

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

Oracle数据库:

查询今天数据:

SELECT COUNT(*) FROM 表名 WHERE TO_CHAR(T_RKSJ,'YYYY-MM-DD')=TO_CHAR(SYSDATE,'YYYY-MM-DD')

查询昨天数据:

SELECT COUNT(*) FROM  表名 WHERE TO_CHAR(T_RKSJ,'YYYY-MM-DD')=TO_CHAR(SYSDATE-1,'YYYY-MM-DD')

查询本周数据:

SELECT COUNT(*) FROM 表名 WHERE T_RKSJ >= TRUNC(NEXT_DAY(SYSDATE-8,1)+1) AND T_RKSJ < TRUNC(NEXT_DAY(SYSDATE-8,1)+7)+1

查询上周数据:

SELECT COUNT(*) FROM 表名 WHERE T_RKSJ >= TRUNC(NEXT_DAY(SYSDATE-8,1)-6) AND T_RKSJ < TRUNC(NEXT_DAY(SYSDATE-8,1)+1)

查询本月数据:

SELECT COUNT(*) FROM 表名 WHERE TO_CHAR(T_RKSJ,'YYYY-MM')=TO_CHAR(SYSDATE,'YYYY-MM')

查询上月数据:

SELECT COUNT(*) FROM 表名 WHERE TO_CHAR(T_RKSJ,'YYYY-MM')=TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYY-MM')

备注:NEXT_DAY(SYSDATE,1)函数为当前系统时间的下个星期日时间,数字1代表星期日;

 

 

<think>嗯,用户这次问的是如何在Oracle中获取上个月第一天的日期函数。这个问题看起来简单,但结合之前的引用内容,发现用户其实已经接触过几个关键函数了:SYSDATE、ADD_MONTHS和LAST_DAY,特别是引用[2]里明确提到了用ADD_MONTHS计算相邻月份的操作。用户的上次提问被系统标记为“参考站内引用”,但那些引用更多是在示例不同日期场景(比如上周日、月末等),而用户此刻的需求非常聚焦——只要上个月首日。考虑到用户可能正在编写月度报表脚本,需要动态获取日期范围。从技术实现看,最直接的方案是用ADD_MONTHS配合TRUNC函数。虽然引用[2]里出现过LAST_DAY(add_months(sysdate,1))这种下个月末的写法,但用户要的是上个月初。这里有个小陷阱:如果直接用ADD_MONTHS(SYSDATE,-1),得到的是上月同日,当本月大于28天时可能返回不存在的日期(比如3月30日会返回2月30日报错)。所以更稳妥的做法是取本月首日再减一个月,即TRUNC(SYSDATE,'MM')-INTERVAL'1'MONTH。不过注意到引用[1]的目录里提到INTERVAL数据类型属于“高级日期函数”,可能用户环境不支持。那就改用基础函数组合:先TRUNC(SYSDATE,'MM')取本月1号,再用ADD_MONTHS减1个月——这个方案在引用[2]的add_months(sysdate,1)逻辑上逆向推导即可。最后生成的代码特意写了两种等价形式,因为引用[3]显示用户用过to_char转换,说明可能需要字符串输出。额外补充的LAST_DAY(ADD_MONTHS(SYSDATE,-2))+1这种写法虽然绕,但能解决闰年问题,顺便教用户理解日期计算的本质:上个月第一天,其实就是上上个月最后一天的次日啊。</think> 在Oracle数据库中查询上个月第一天的日期,可通过以下三种高效方式实现(均输出DATE类型,使用TO_CHAR可转为字符串格式): ### 1. 基础写法(推荐) ```sql SELECT TRUNC(ADD_MONTHS(SYSDATE, -1), 'MM') FROM DUAL; ``` **说明**: - `ADD_MONTHS(SYSDATE, -1)`:获取当前日期前推一个月的日期(精确到日) - `TRUNC(..., 'MM')`:截断到当月第一天 ### 2. 等价写法 ```sql SELECT ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1) FROM DUAL; ``` **说明**: - 先取当前月第一天,再前推一个月 ### 3. 扩展写法(避免闰月问题) ```sql SELECT TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE, -2)) + 1) FROM DUAL; ``` **说明**: - `ADD_MONTHS(SYSDATE, -2)`:前推两个月 - `LAST_DAY(...)`:得到前两个月的最后一天 - `+1`:获得上个月第一天 --- ### 示例结果 若当前日期为 `2024-07-15`,则上述所有语句均返回: **2024-06-01 00:00:00**(DATE类型)
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值