oracle中小时的表示方法贴出来与大家共享!
小时表示方法to_date( ::yyyymmdd hh:mi:ss)
小时表示方法to_date( ::yyyymmdd hh:mi:ss)
select usernumber from usertailor where createtime>to_date( :: yyyymmdd hh:mi:ss);
常用日期型函数
Sysdate 当前日期和时间
SQL> Select sysdate from dual;
SYSDATE
月
Last_day 本月最后一天
SQL> Select last_day(sysdate) from dual;
LAST_DAY(S
月
Add_months(dn) 当前日期d后推n个月
用于从一个日期值增加或减少一些月份
date_value:=add_months(date_valuenumber_of_months)
SQL> Select add_months(sysdate) from dual;
ADD_MONTHS
月
Months_between(fs) 日期f和s间相差月数
SQL> select months_between(sysdateto_date(yyyymmdd))from dual;
MONTHS_BETWEEN(SYSDATETO_DATE(YYYYMMDD))
NEXT_DAY(d day_of_week)
返回由day_of_week命名的在变量d指定的日期之后的第一个工作日的日期参数day_of_week必须为该星期中的某一天
SQL> SELECT next_day(to_date(YYYYMMDD)) FROM dual;
NEXT_DAY(T
月
current_date()返回当前会话时区中的当前日期
date_value:=current_date
SQL> column sessiontimezone for a
SQL> select sessiontimezonecurrent_date from dual;
SESSIONTIMEZONE CURRENT_DA
+: 月
SQL> alter session set time_zone=: /
会话已更改
SQL> select sessiontimezonecurrent_timestamp from dual;
SESSIONTIMEZONE CURRENT_TIMESTAMP
: 月 下午 :
current_timestamp()以timestamp with time zone数据类型返回当前会话时区中的当前日期
SQL> select current_timestamp from dual;
CURRENT_TIMESTAMP
月 上午 +:
dbtimezone()返回时区
SQL> select dbtimezone from dual;
DBTIME
:
extract()找出日期或间隔值的字段值
date_value:=extract(date_field from [datetime_value|interval_value])
SQL> select extract(month from sysdate) This Month from dual;
This Month
SQL> select extract(year from add_months(sysdate)) Years from dual;
Years
localtimestamp()返回会话中的日期和时间
SQL> select localtimestamp from dual;
LOCALTIMESTAMP
月 上午
常用日期数据格式(该段为摘抄)
Y或YY或YYY 年的最后一位两位或三位 Select to_char(sysdateYYY) from dual 表示年
SYEAR或YEAR SYEAR使公元前的年份前加一负号 Select to_char(sysdateSYEAR) from dual 表示公元前 年
Q 季度~月为第一季度 Select to_char(sysdateQ) from dual 表示第二季度①
MM 月份数 Select to_char(sysdateMM) from dual 表示月
RM 月份的罗马表示 Select to_char(sysdateRM) from dual IV表示月
Month 用个字符长度表示的月份名 Select to_char(sysdateMonth) from dual May后跟个空格表示月
WW 当年第几周 Select to_char(sysdateWW) from dual 表示年月日为第周
W 本月第几周 Select to_char(sysdateW) from dual 年月日为第周
DDD 当年第几 月日为月日为 Select to_char(sysdateDDD) from dual 年 月 日为第天
DD 当月第几天 Select to_char(sysdateDD) from dual 月日为第天
D 周内第几天 Select to_char(sysdateD) from dual 年月日为星期一
DY 周内第几天缩写 Select to_char(sysdateDY) from dual SUN 年月日为星期天
HH或HH 进制小时数 Select to_char(sysdateHH) from dual 午夜点过分为
HH 小时制 Select to_char(sysdateHH) from dual 下午点分为
MI 分钟数(~) Select to_char(sysdateMI) from dual 下午点分
SS 秒数(~) Select to_char(sysdateSS) from dual 点分秒
提示注意不要将MM格式用于分钟(分钟应该使用MI)MM是用于月份的格式将它用于分钟也能工作但结果是错误的
现在给出一些实践后的用法
上月末天
SQL> select to_char(add_months(last_day(sysdate))yyyyMMdd) LastDay from
dual;
LASTDAY
上月今天
SQL> select to_char(add_months(sysdate)yyyyMMdd) PreToday from dual;
PRETODAY
上月首天
SQL> select to_char(add_months(last_day(sysdate)+)yyyyMMdd) firstDay from dual;
FIRSTDAY
按照每周进行统计
SQL> select to_char(sysdateww) from dual group by to_char(sysdateww);
TO
按照每月进行统计
SQL> select to_char(sysdatemm) from dual group by to_char(sysdatemm);
TO
按照每季度进行统计
SQL> select to_char(sysdateq) from dual group by to_char(sysdateq);
T
按照每年进行统计
SQL> select to_char(sysdateyyyy) from dual group by to_char(sysdateyyyy);
TO_C
要找到某月中所有周五的具体日期
select to_char(tdYYMMDD) from (
select trunc(sysdate MM)+rownum as d
from dba_objects
where rownum < ) t
where to_char(td MM) = to_char(sysdate MM) 找出当前月份的周五的日期
and trim(to_char(td Day)) = 星期五
如果把where to_char(td MM) = to_char(sysdate MM)改成sysdate即为查找当前月份的前三个月中的每周五的日期
oracle中时间运算
内容如下
oracle支持对日期进行运算
日期运算时是以天为单位进行的
当需要以分秒等更小的单位算值时按时间进制进行转换即可
进行时间进制转换时注意加括号否则会出问题
SQL> alter session set nls_date_format=yyyymmdd hh:mi:ss;
会话已更改
SQL> set serverout on
SQL> declare
DateValue date;
begin
select sysdate into DateValue from dual;
dbms_outputput_line(源时间:||to_char(DateValue));
dbms_outputput_line(源时间减天:||to_char(DateValue));
dbms_outputput_line(源时间减天小时:||to_char(DateValue/));
dbms_outputput_line(源时间减天小时分:||to_char(DateValue//(*)));
dbms_outputput_line(源时间减天小时分秒:||to_char(DateValue//(*)/(**)));
end;
/
源时间: ::
源时间减天: ::
源时间减天小时: ::
源时间减天小时分: ::
源时间减天小时分秒: ::
PL/SQL 过程已成功完成
在Oracle中实现时间相加处理
名称Add_Times
功能返回d与NewTime相加以后的结果实现时间的相加
说明对于NewTime中的日期不予考虑
日期
版本
作者Kevin
create or replace function Add_Times(d in dateNewTime in date) return date
is
hh number;
mm number;
ss number;
hours number;
dResult date;
begin
下面依次取出时分秒
select to_number(to_char(NewTimeHH)) into hh from dual;
select to_number(to_char(NewTimeMI)) into mm from dual;
select to_number(to_char(NewTimeSS)) into ss from dual;
换算出NewTime中小时总和在一天的百分几
hours := (hh + (mm / ) + (ss / ))/ ;
得出时间相加后的结果
select d + hours into dResult from dual;
return(dResult);
end Add_Times;
测试用例
select Add_Times(sysdateto_date( ::YYYYMMDD HH:MI:SS)) from dual
在Oraclei中计算时间差
计算时间差是Oracle DATA数据类型的一个常见问题Oracle支持日期计算你可以创建诸如日期-日期这样的表达式来计算这两个日期之间的时间差
一旦你发现了时间差异你可以使用简单的技巧来以天小时分钟或者秒为单位来计算时间差为了得到数据差你必须选择合适的时间度量单位这样就可以进行数据格式隐藏
使用完善复杂的转换函数来转换日期是一个诱惑但是你会发现这不是最好的解决方法
round(to_number(enddatestart_date)) 消逝的时间(以天为单位)
round(to_number(enddatestart_date)*) 消逝的时间(以小时为单位)
round(to_number(enddatestart_date)*) 消逝的时间(以分钟为单位)
显示时间差的默认模式是什么?为了找到这个问题的答案让我们进行一个简单的SQL *Plus查询
SQL> select sysdate(sysdate) from dual;
SYSDATE(SYSDATE)
这里我们看到了Oracle使用天来作为消逝时间的单位所以我们可以很容易的使用转换函数来把它转换成小时或者分钟然而当分钟数不是一个整数时我们就会遇到放置小数点的问题
Select
(sysdate(sysdate))*
from
dual;
(SYSDATE(SYSDATE))*
当然我们可以用ROUND函数(即取整函数)来解决这个问题但是要记住我们必须首先把DATE数据类型转换成NUMBER数据类型
Select
round(to_number(sysdate(sysdate))*)
from
dual;
ROUND(TO_NUMBER(SYSDATE(SYSDATE))*)
我们可以用这些函数把一个消逝时间近似转换成分钟并把这个值写入Oracle表格中在这个例子里我们有一个离线(logoff)系统级触发机制来计算已经开始的会话时间并把它放入一个Oracle STATSPACK USER_LOG扩展表格之中
Update
perfstatstats$user_log
set
elapsed_minutes =
round(to_number(logoff_timelogon_time)*)
where
user = user_id
and
elapsed_minutes is NULL;
查出任一年月所含的工作日
CREATE OR REPLACE FUNCTION Get_WorkingDays(
ny IN VARCHAR
) RETURN INTEGER IS
/*
函数名称Get_WorkingDays
中文名称求某一年月中共有多少工作日
作者姓名: XINGPING
编写时间:
输入参数NY:所求包含工作日数的年月格式为yyyymm如
返 回 值整型值包含的工作日数目
算法描述
)列举出参数给出的年月中的每一天这里使用了一个表(ljrq是我的库中的一张表这个表可以是有权访问的记录条数至少为的任意一张表或视图)来构造出某年月的每一天
)用这些日期和一个已知星期几的日期相减(是星期天)所得的差再对求模如果所求年月在以前那么所得的差既是负数求模后所得值范围为大于小于如表示星期六故先将求模的结果加再求的模
)过滤掉结果集中值为和的元素然后求count所得即为工作日数目
*/
Result INTEGER;
BEGIN
SELECT COUNT(*) INTO Result
FROM (SELECT MOD(MOD(qrqto_date(yyyymmdd))) weekday
FROM ( SELECT to_date(ny||tddyyyymmdd) rq
FROM (SELECT substr(+ROWNUM) dd
FROM ljrq z WHERE Rownum<=
) t
WHERE to_date(ny||tddyyyymmdd)
BETWEEN to_date(nyyyyymm)
AND last_day(to_date(nyyyyymm))
)q
) a
WHERE aweekday NOT IN();
RETURN Result;
END Get_WorkingDays;
______________________________________
还有一个版本
CREATE OR REPLACE FUNCTION Get_WorkingDays(
ny IN VARCHAR
) RETURN INTEGER IS
/*
函数名称Get_WorkingDays
中文名称求某一年月中共有多少工作日
作者姓名: XINGPING
编写时间:
输入参数NY:所求包含工作日数的年月格式为yyyymm如
返 回 值整型值包含的工作日数目
算法描述使用Last_day函数计算出参数所给年月共包含多少天根据这个值来构造一个循环在这个循环中先求这个月的每一天与一个已知是星期天的日期(是星期天)的差所得的差再对求模如果所求日期在以前那么所得的差既是负数求模后所得值范围为大于小于如表示星期六故先将求模的结果加再求的模 如过所得值不等于和(即不是星期六和星期天)则算一个工作日
*/
Result INTEGER := ;
myts INTEGER; 所给年月的天数
scts INTEGER; 某天距所差的天数
rq DATE;
djt INTEGER := ;
BEGIN
myts := to_char(last_day(to_date(nyyyyymm))dd);
LOOP
rq := TO_date(ny||substr(+djt)yyyymmdd);
scts := rq to_date(yyyymmdd);
IF MOD(MOD(scts)+) NOT IN() THEN
Result := Result + ;
END IF;
djt := djt + ;
EXIT WHEN djt>myts;
END LOOP;
RETURN Result;
END Get_WorkingDays;