`
wzhiju
  • 浏览: 138995 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

sql 语句对时间操作的总结(转)

 
阅读更多
sql 语句对时间操作的总结来源:

延迟:
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,'fmww') from dual


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


本月的天数
SELECT to_char(last_day(SYSDATE),'dd') days FROM dual



今年的天数
select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual


下个星期一的日期
SELECT Next_day(trunc(SYSDATE),'monday') FROM dual


================================



计算工作日方法
create table t(s date,e date);
alter session set nls_date_format = 'yyyy-mm-dd';
insert into t values('2003-03-01','2003-03-03');
insert into t values('2003-03-02','2003-03-03');
insert into t values('2003-03-07','2003-03-08');
insert into t values('2003-03-07','2003-03-09');
insert into t values('2003-03-05','2003-03-07');
insert into t values('2003-02-01','2003-03-31');


-- 这里假定日期都是不带时间的,否则在所有日期前加trunc即可。

select s,e,e-s+1 total_days, trunc((e-s+1)/7)*5 + length(replace(substr('01111100111110',to_char(s,'d'),mod(e-s+1,7)),'0','')) work_days from t;

-- drop table t;



========================================================


判断当前时间是上午下午还是晚上
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;

==========================================================

Oracle 中的一些处理日期

将数字转换为任意时间格式.如秒:需要转换为天/小时
SELECT to_char(floor(TRUNC(936000/(60*60))/24))||'天'||to_char(mod(TRUNC(936000/(60*60)),24))||'小时' FROM DUAL

TO_DATE格式
Day:
dd number 12
dy abbreviated fri
day spelled out friday
ddspth spelled out, ordinal twelfth
Month:
mm number 03
mon abbreviated mar
month spelled out march
Year:
yy two digits 98
yyyy four digits 1998



24小时格式下时间范围为: 0:00:00 - 23:59:59....
12小时格式下时间范围为: 1:00:00 - 12:59:59 ....



1. 日期和字符转换函数
用法(to_date,to_char)

2.
select to_char( to_date(222,'J'),'Jsp') from dual
显示Two Hundred Twenty-Two

3. 求某天是星期几
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; 
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;


设置日期语言
ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
也可以这样
TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')



4. 两个日期间的天数
select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;


5. 时间为null的用法
select id, active_date from table1
UNION
select 1, TO_DATE(null) from dual; 

注意要用TO_DATE(null)

6.
a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')
那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。
所以,当时间需要精确的时候,觉得to_char还是必要的


7. 日期格式冲突问题
输入的格式要看你安装的ORACLE字符集的类型, 比如:
US7ASCII, date格式的类型就是: '01-Jan-01'
alter system set NLS_DATE_LANGUAGE = American
alter session set NLS_DATE_LANGUAGE = American

或者在to_date中写

select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;

注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多, 可查看

select * from nls_session_parameters
select * from V$NLS_PARAMETERS



8.
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
)
where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )
not in ( '1', '7' )


查找2002-02-28至2002-02-01间除星期一和七的天数
在前后分别调用DBMS_UTILITY.GET_TIME, 然后将结果相减(得到的是1/100秒, 而不是毫秒).


9.

select months_between(to_date('01-31-1999','MM-DD-YYYY'), to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

1

select months_between(to_date('02-01-1999','MM-DD-YYYY'),
to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

1.03225806451613



10. Next_day的用法

Next_day(date, day)
Monday-Sunday, for format code DAY
Mon-Sun,       for format code DY
1-7,           for format code D


11

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

注意:第一条记录的TIME 与最后一行是一样的

可以建立一个函数来处理这个问题

create or replace function sys_date return date is

begin

return sysdate;

end;

select to_char(sys_date,'hh:mi:ss') from all_objects;



12. 获得小时数

SQL> select sysdate ,to_char(sysdate,'hh') from dual;



SYSDATE TO_CHAR(SYSDATE,'HH')

-------------------- ---------------------

2003-10-13 19:35:21 07



SQL> select sysdate ,to_char(sysdate,'hh24') from dual;



SYSDATE TO_CHAR(SYSDATE,'HH24')

-------------------- -----------------------

2003-10-13 19:35:21 19



获取年月日与此类似





13. 年月日的处理

select older_date,

newer_date,

years,

months,

abs(

trunc(

newer_date-

add_months( older_date,years*12+months )

)

) days

from ( select

trunc(months_between( newer_date, older_date )/12) YEARS,

mod(trunc(months_between( newer_date, older_date )),

12 ) MONTHS,

newer_date,

older_date

from ( select hiredate older_date,

add_months(hiredate,rownum)+rownum newer_date

from emp )

)



14. 处理月份天数不定的办法

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual



16. 找出今年的天数

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual



闰年的处理方法

to_char( last_day( to_date('02' | | :year,'mmyyyy') ), 'dd' )

如果是28就不是闰年



17. yyyy与rrrr的区别

'YYYY99 TO_C

------- ----

yyyy 99 0099

rrrr 99 1999

yyyy 01 0001

rrrr 01 2001



18.不同时区的处理

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

from dual;



19.  5秒钟一个间隔

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')

from dual



TO_DATE(FL TO_CH

---------- -----

2007-01-01 60368



SSSSS表示5位秒数



20. 一年的第几天

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual



TO_ SYSDATE

--- ----------

017 2007-01-17



21.计算小时,分,秒,毫秒
select
Days, A,
TRUNC(A*24) Hours,
TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,
TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,
TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds
from
(
select
trunc(sysdate) Days,
sysdate - trunc(sysdate) A
from dual
)

select * from tabname
order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');
//
floor((date2-date1) /365)      作为年
floor((date2-date1, 365) /30)  作为月
mod(mod(date2-date1, 365), 30) 作为日.


22.next_day函数
next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。
1 2 3 4 5 6 7
日 一 二 三 四 五 六

--------------------------------------------------------------- 

select (sysdate-to_date('2003-12-03 12:55:45','yyyy-mm-dd hh24:mi:ss'))*24*60*60 from dual

日期 返回的是天 然后 转换为ss

6
7
分享到:
评论
2 楼 meiyaa2008 2011-07-13  
整理很好,谢谢
1 楼 m635674608 2011-07-13  
还不错。。。

相关推荐

    SQL Oracle 语句操作总结

    自己总的一些使用方法和技巧,包含数据库操作常见的方法,时间处理,字符串处理

    核电建造系统SQL操作语句

    总结了核电建造系统所使用的所有sql 语句涉及工程统计、技术变更、计划编制、库存管理、工程量统计,服务了国内22台核机组

    MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法总结

    主要介绍了MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法,总结分析了MySQL建表、编码设置、字段添加、索引操作所涉及的SQL语句,需要的朋友可以参考下

    SQL21日自学通

    第15 天对SQL 语句优化以提高其性能306 目标306 让你的SQL 语句更易读307 全表扫描308 加入一个新的索引309 在查询中各个元素的布局309 过程311 避免使用OR311 OLAP 与OLTP 的比较313 OLTP 的调试313 OLAP 的调试314...

    精通SQL--结构化查询语言详解

    1.5.3 sql语句的结构 13 .1.5.4 sql的优点 13 1.5.5 sql的执行 14 1.6 sql环境 15 1.6.1 环境 15 1.6.2 sql的层次结构 15 1.6.3 客户程序和服务程序系统 17 1.6.4 sql环境中对象的命名规则 18 第2章 主要的...

    SQL查询安全性及性能优化

    说明:通过这个报表找到排在前10 的sql语句,如果这些语句是用户编写的sql语句,我可以对其进行优化。 我们可以根据这些信息筛选出需要优化的SQL语句进行优化 SQL优化经验  大表缺索引---必要字段上建立索引  ...

    数据库sql优化总结

    SQL语句操作,消耗了70%~90%的数据库资源; 独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低;

    sql总结.doc

    在Oracle中,触发器是一种特殊的存储过程,也是由一组sql语句以及一些业务逻辑代码组成的。数据库可以通过增、删、改来触发触发器。 (2)触发器的基本写法 create or replace trigger tri_adddept AFTER INSERT ...

    六条比较有用的MySQL数据库操作的SQL语句小结

    在MySQL数据库操作中,我们常常编写一些SQL语句来实现自己想要的功能。但是对于初学MySQL数据库的人来说这似乎又有一定的难度。本文我们总结了六条比较有用的SQL语句,初学者可以套用下面的格式,接下来就让我们一...

    (第一卷)Microsoft.SQL.Server.2008技术内幕:T-SQL语言基础

    2.5 同时操作(ALL-AT-ONCE OPERATION) 2.6 处理字符数据 2.7 处理日期和时间数据 2.8 查询元数据 2.9 总结 2.10 练习 2.11 解决方案 第3章 联接查询 3.1 交叉联接 3.2 内联接 3.3 特殊的联接实例 3.4 ...

    (第二卷)Microsoft SQL Server 2008技术内幕:T-SQL语言基础

    2.5 同时操作(ALL-AT-ONCE OPERATION) 2.6 处理字符数据 2.7 处理日期和时间数据 2.8 查询元数据 2.9 总结 2.10 练习 2.11 解决方案 第3章 联接查询 3.1 交叉联接 3.2 内联接 3.3 特殊的联接...

    Microsoft SQL Server 2005技术内幕:T-SQL查询

     2.5 同时操作(ALL-AT-ONCE OPERATION)  2.6 处理字符数据  2.7 处理日期和时间数据  2.8 查询元数据  2.9 总结  2.10 练习  2.11 解决方案 第3章 联接查询  3.1 交叉联接  3.2 内联接  3.3 ...

    精通SQL 结构化查询语言详解

    1.5.3 SQL语句的结构  1.5.4 SQL的优点  1.5.5 SQL的执行  1.6 SQL环境  1.6.1 环境  1.6.2 SQL的层次结构  1.6.3 客户程序和服务程序系统  1.6.4 SQL环境中对象的命名规则  第2章 主要的关系...

    SQL注入攻击与防御

    本书作者均是专门研究SQL注入的安全专家,他们集众家之长,对应用程序的基本编码和升级维护进行全面跟踪,详细讲解可能引发SQL注入的行为以及攻击者的利用要素,并结合长期实践经验提出了相应的解决方案。...

    关于关系表的连接操作在SQLSERVER与Oracle中测试大全

    这是我个人通过长时间的实践与收集最后总结出来的基本关系表的连接操作实际应用,以及在某些情况下可以用普通的sql语句代替某些连接操作(即实现同样的功能)其中文件夹中已经包含了测试所需数据库,这是备份形式需...

    SQL注入攻击与防御(安全技术经典译丛)

    针对SQL注入隐蔽性极强的特点,本书重点讲解了SQL注入的排查方法和可以借助的工具,总结了常见的利用SQL漏洞的方法。另外,本书还专门从代码层和系统层的角度介绍了避免SQL注入的各种策略和需要考虑的问题。  本书...

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    阅读《Microsoft SQL Server 2008技术内幕:T-SQL查询》,可以充分地理解T-SQL语言和良好的编程实践,学会如何编写更加有效而强大的查询语句。 序言 I 致谢III 前言 V 第1章 逻辑查询处理 1.1 逻辑查询处理的...

    SQLServer2008技术内幕T-SQL查询包含源代码及附录A

    《Microsoft SQL Server 2008技术内幕:T-SQL查询》全面深入地介绍了Microsoft SQL Server 2008中高级T-SQL查询、性能优化等方面的内容,以及SQL Server 2008新增加的一些特性。主要内容包括SQL的基础理论、查询优化...

    SQL SERVER 2000开发与管理应用实例

    3.6 字符串在动态Transact-SQL语句中的应用 85 3.6.1 动态Transact-SQL语句概述 85 3.6.2 字符串在编号查询中的使用 87 3.6.3 动态参数存储过程 90 3.6.4 动态Transact-SQL语句中常见问题 92 3.7 ...

Global site tag (gtag.js) - Google Analytics