常用sql
<1> 时间sql
// An highlighted block
select
trunc(sysdate, 'd') + 1 本周第一天,
trunc(sysdate, 'd') + 7 本周最后一天,
trunc(sysdate, 'month') 本月第一天,
trunc(last_day(sysdate)) 本月最后一天,
trunc(sysdate, 'mm') 本月第一天,
last_day(trunc(sysdate)) 本月最后一天,
trunc(add_months(sysdate, -1), 'month') 上月第一天,
trunc(last_day(add_months(sysdate, -1))) 上月最后一天,
trunc(add_months(sysdate, -12), 'month') 去年本月第一天,
trunc(last_day(add_months(sysdate, -12))) 去年本月最后一天
from dual
<2>重复数据去重,只取最新的一条数据
SELECT *FROM (
SELECT t.*
ROW_NUMBER() OVER (PARTITION BY t.unitid ORDER BY T.INTIME desc) rowbumber FROM xxx T
) WHERE rowbumber = 1
解释 首先看 ,这段话就是简单获取T,下的数据
SELECT t.* rowbumber
FROM xxx T
紧接着根据指定字段(好比unitid),等同于查询 unitid == ‘OXOO11’ 等于字符 OXOO11 的所有行(row),编个序号
SELECT t.UNITID,t.INTIME ,ROW_NUMBER() OVER (PARTITION BY t.unitid ORDER BY T.INTIME desc) rowbumber
FROM xxx T
WHERE 1=1
AND t.WORKORDER = 'xxx' AND t.CURPROCESSNAME = 'xxx'
结果如下
然后使用子查询查询rowbumber = ‘1’ 的就可以了
<3>oracle字符串截取,oracle指定字符串截取,取第 n 位
--'aaa.bbb.cc' 要截取的字符串
--[^.]+ [^.] 去掉字符 '.' , + 代表按块取值,两个点之间的值算一个
--1,3 1 代表从 (split) 的数组中类似于String[] 第 1 个值开始,3代表,往后数三个(包含第一个)
SELECT regexp_substr('aaa.bbb.cc','[^.]+',1,3) FROM dual
-- 结果就是 cc