ORACLE 时间戳。根据两列分组排序。日期函数

时间:2021-09-10 09:41:51
1 SELECT 
2 EXTRACT (DAY FROM DT2-DT1)*24+EXTRACT(HOUR FROM DT2-DT1) ||':'||EXTRACT(MINUTE FROM DT2-DT1) ||':'||EXTRACT (SECOND FROM DT2-DT1 )
3 FROM(
4 SELECT
5 TO_TIMESTAMP('2014/12/03 00:00:00','YYYY-MM-DD HH24:MI:SS') DT1,
6 TO_TIMESTAMP('2014/12/04 23:59:59','YYYY-MM-DD HH24:MI:SS') DT2
7 FROM DUAL)
注:TO_TIMESTAMP日期为TO_char型

两个日期直接相减得出的是天数。
select sysdate-(sysdate-1) from dual;

2、关于空值(null)

关系模型只有真、假两个结果;而SQL语言允许有三个结果:真、假、未知。

而对于未知这种结果,oracle会认为是正确的,于是在很多的搜索条件中都必须要注意这一点,否则搜索出来的结果和预期会有很大的出入

order by 语句默认把null值放在最后输出,如果要把它放在前边,需要在order by 语句后面加上 nulls first

null在聚合函数中,会被自动的去除掉,也就是不参与聚合函数的运算

3.根据stage 和 times分组排序。

ROW_NUMBER() OVER(PARTITION BY STAGE ORDER BY TIMES DESC) NO

sysdate+(5/24/60/60) 在系统时间基础上延迟5秒
sysdate
+5/24/60 在系统时间基础上延迟5分钟
sysdate
+5/24 在系统时间基础上延迟5小时
sysdate
+5 在系统时间基础上延迟5天
add_months(sysdate,
-5) 在系统时间基础上延迟5月
add_months(sysdate,
-5*12) 在系统时间基础上延迟5年


上月末的日期:
select last_day(add_months(sysdate, -1)) from dual;
本月的最后一秒:
select trunc(add_months(sysdate,1),'MM') - 1/24/60/60 from dual
本周星期一的日期:
select trunc(sysdate,'day')+1 from dual

年初至今的天数:
select ceil(sysdate - trunc(sysdate, 'year')) from dual;

今天是今年的第几周 :
select to_char(sysdate,'ww') from dual
今天是本月的第几周:SELECT TO_CHAR(SYSDATE,
'WW') - TO_CHAR(TRUNC(SYSDATE,'MM'),'WW') + 1 AS "weekOfMon" FROM dual


判断当前时间是上午下午还是晚上

SELECT CASE
WHEN to_number(to_char(SYSDATE,
'hh24')) BETWEEN 6 AND 11 THEN '上午'
WHEN to_number(to_char(SYSDATE,
'hh24')) BETWEEN 11 AND 17 THEN '下午'
WHEN to_number(to_char(SYSDATE,
'hh24')) BETWEEN 17 AND 21 THEN '晚上'
END
FROM dual;


select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;
monday
设置日期语言
ALTER SESSION SET NLS_DATE_LANGUAGE
='AMERICAN';
也可以这样
TO_DATE (
'2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')


找某段时间的资料:

select  count(*) from ( select rownum-1  rnum  from all_objects
where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-02-01','yyyy-mm-dd')+1
)