oracle数据库 date时间类型查询昨天、前7天、前30天、前1年的数据,sql语句怎么写

oracle数据库 date时间类型查询昨天、前7天、前30天、前1年的数据,sql语句怎么写,第1张

1、打开plsql,连接上oracle数据库,使用sql语句创建一张测试表。

2、使用sql语句插入3行测试数据到上一步创建的测试表中,日期栏位使用系统当前时间插入。

3、执行完sql之后,记得点击提交按钮,提交更改到数据库保存,否则,数据不会真正存储到数据库中。

4、提交完之后,查询刚刚插入的数据,select * from TestDate。

5、修改第一行Updatedate栏位的值,此时直接拼接日期格式的字符串更新,oracle是无法执行的。

6、修改第一行Updatedate栏位的值,将字符串的日期转换为日期类型,之后再修改,就可以更新了。

7、修改第一行Updatedate栏位的值,使用当前日期减去2天,直接减2即可。

select *

from 表

where floor(to_number(sysdate-to_date(Info_timeE,'yyyy-mm-dd hh24:mi:ss'))) <7

我的大概想法和思路(本人无环境,所有内容都是臆想出来的,没办法测试)

(1)分组,因为是只要连续7天内5天即可,每天的次数并不重要,所以按照(人名和日期(不是时间是日期也就是截取到日)分组),这样可以去掉每天重复的次数。

(2)分好组后的内容,按照人名和日期排序。这样也就是说所有张三的都在一起,李四的都在一起,而且每个人的都是按照日期排序的。(这步其实不做也可以,因为下面的lead函数本身也可以分组排序,不过这样说对你来说更直观一些)

(3)利用lead函数(就是查某行数据的下几行的函数,可能你没有用过,我用的次数也不多。)往下查4行。

这个就是出现了5次,因为:四行+本身=5次,只要证明这5次发生在7天内就可以了。

(4)所以最后一步就是利用lead的列-原来的时间列小于等于6就可以了,只要小于等于6,那么就符合条件(因为相减为7那么是8天,所以要相减为6),就输出。

我按照你给的数据,大概写一个,不一定能用(什么转换之类的我都没写,所以基本肯定不能直接用),不过意思你大概应该能明白。

seelct * from

(select a.人名,a.日期,lead(a.日期,4,null)over(partition by 人名 order by q.日期) 五次后的日期 from

(select 人名,trunc(时间,'dd')日期 from table geoup by 人名,trunc(时间,'dd')) a

) b where b. 五次后的日期-b.日期<=6

大概就是这么个意思。

第二步select查出来的内容,应该类似

张三 2001-10-1 2001-10-7

张三 2001-10-2 null(按照现有的数据来说就是null,这样就不能说是出现了5天了)

同样下面的张三也都是null

李四 2001-10-4 2001-10-10

李四 2001-10-6 2001-10-11

李四 2001-10-8 2001-10-12


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9870862.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存