前言
工作中需要按各种时间范围查询数据库,再此统计了绝大部分的时间情况,方便开发。
按天操作
按天操作可以和后面几种混用达到更多的效果
-- 按天操作,往后查使用加,往前查使用减
-- 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;
评论区