侧边栏壁纸
  • 累计撰写 25 篇文章
  • 累计创建 27 个标签
  • 累计收到 43 条评论

目 录CONTENT

文章目录

Oracle 时间查询最全合集

junior
2022-05-26 / 0 评论 / 2 点赞 / 379 阅读 / 2,830 字

前言

工作中需要按各种时间范围查询数据库,再此统计了绝大部分的时间情况,方便开发。

按天操作

按天操作可以和后面几种混用达到更多的效果

-- 按天操作,往后查使用加,往前查使用减
-- sysdate+1 加一天
-- sysdate+1/24 加1小时
-- sysdate+1/(24*60) 加1分钟
-- sysdate+1/(24*60*60) 加1秒钟
-- 类推至毫秒0.001秒
-- 此刻时间
select sysdate from dual;
-- 当天零点
select trunc(sysdate,'dd') from dual;
-- 当天最后一秒
select trunc(sysdate) + 1 - 1/(24*60*60)  from dual;

-- 当天前三天
select sysdate -3 from dual;

按周操作

分为两种情况,一种是周日为第一天,一种是周一为第一天

-- 按星期操作
-- 当前星期第一天的零点
select trunc(sysdate,'W') from dual;  -- 周日开始
select trunc(sysdate,'IW') from dual; -- 周一开始
-- 当前星期第一天的此刻
select to_date(concat(to_char(trunc(sysdate,'W'),'yyyy-mm-dd '),to_char(sysdate,'hh24:mi:ss')), 'yyyy-mm-dd hh24:mi:ss') from dual; -- 周日开始
select to_date(concat(to_char(trunc(sysdate,'IW'),'yyyy-mm-dd '),to_char(sysdate,'hh24:mi:ss')), 'yyyy-mm-dd hh24:mi:ss') from dual; -- 周一开始
-- 当前星期第一天的最后一秒
select trunc(sysdate,'W') + 1 - 1/(24*60*60) from dual;  -- 周日开始
select trunc(sysdate,'IW') + 1 - 1/(24*60*60) from dual; -- 周一开始
-- 当前星期第后一天的零点
select trunc(sysdate,'W') + 6 from dual;  -- 周日开始
select trunc(sysdate,'IW') + 6 from dual; -- 周一开始
-- 当前星期第后一天的此刻
select to_date(concat(to_char(trunc(sysdate,'W') + 6,'yyyy-mm-dd '),to_char(sysdate,'hh24:mi:ss')), 'yyyy-mm-dd hh24:mi:ss') from dual; -- 周日开始
select to_date(concat(to_char(trunc(sysdate,'IW') + 6,'yyyy-mm-dd '),to_char(sysdate,'hh24:mi:ss')), 'yyyy-mm-dd hh24:mi:ss') from dual; -- 周一开始
-- 当前星期第后一天的最后一秒
select trunc(sysdate,'W') + 7 - 1/(24*60*60) from dual;  -- 周日开始
select trunc(sysdate,'IW') + 7 - 1/(24*60*60) from dual; -- 周一开始

-- 当天前三个星期
select sysdate -21 from dual;

按月操作

-- 按月操作
-- 当月第一天零点
select trunc(sysdate,'mm') from dual;
-- 当月第一天此刻
select to_date(to_char(sysdate,'hh24:mi:ss'),'hh24:mi:ss') from dual;
-- 当月第一天最后一秒
select trunc(sysdate,'mm') + 1 -1/(24*60*60) from dual;
-- 当月最后一天零点
select trunc(last_day(sysdate))  from dual;
-- 当月最后一天此刻
select last_day(sysdate)  from dual;
-- 当月最后一天最后一秒
select trunc(last_day(sysdate))  + 1 -1/(24*60*60)  from dual;

-- 当月前三个月
select add_months(sysdate,-3) from dual;

按年操作

-- 按年操作
-- 当前年第一天零点
select trunc(sysdate,'YYYY') from dual;
-- 当前年第一天此刻
select to_date(concat(to_char(trunc(sysdate,'YYYY'),'yyyy-mm-dd '),to_char(sysdate,'hh24:mi:ss')), 'yyyy-mm-dd hh24:mi:ss') from dual;
-- 当前年第一天最后一秒
select trunc(sysdate,'YYYY') + 1 -1/(24*60*60) from dual;
-- 当前年最后一天零点
select add_months(trunc(sysdate,'YYYY'),12) -1 from dual;
-- 当前年最后一天此刻
select add_months(to_date(concat(to_char(trunc(sysdate,'YYYY'),'yyyy-mm-dd '),to_char(sysdate,'hh24:mi:ss')), 'yyyy-mm-dd hh24:mi:ss'),12) -1 from dual;
-- 当前年最后一天最后一秒
select add_months(trunc(sysdate,'YYYY'),12) -1/(24*60*60)  from dual;

-- 当年前三年
select add_months(sysdate,-36) from dual;

总结

以上时间都是一些特殊时间点,对于任意时间可以通过上面的组合查询得到,如下

-- 取去年三个月前的当天的两个星期前的星期一的零点
select add_months(trunc(sysdate - 14,'IW'),-15) from dual;

2

评论区