ORACLE SYBASE函数整理

本文详细介绍了Oracle和Sybase数据库中的一些关键函数和操作,包括建表、行转列、字符串处理、日期处理、解锁、单位转换、NULL处理以及游标和存储过程的使用。例如,利用row_number()函数获取每个部门最低薪资的员工,使用decode和listagg进行数据转换,以及在Sybase中应用TOP和ISNULL函数等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ORACLE

建表

1)建一个新表,架构、字段属性、约束条件、数据记录跟旧表完全一样:

Create Table print_his_0013 as Select * from print_his_0007 

 

2)建一个新表,架构跟旧表完全一样,但没有内容:

Create Table print_his_0013 as Select * from print_his_0007 where 1=2

 (3建一个新表,只选部分字段:

CREATE TABLE yonghu_bak AS SELECT id, name,sex FROM yonghu;

函数row_number()

当遇到一个部门有多个员工记录,需要去取出每个部门薪水最少的那笔时,就可以用到分析函数row_number()

select * from(

        select manager_id,employee_id,first_name,salary,row_number() 

        over(partition by manager_id order by salary) as currowid

       from hr.employees)

where currowid = 1

行转列

student subject grade

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

student1 语文 80

student1 数学 70

student1 英语 60

student2 语文 90

student2 数学 80

student2 英语 100

……

转换为 

语文 数学 英语

student1 80 70 60

student2 90 80 100

……

语句1:

select student,sum(decode(subject,'语文', grade,null)) "语文",

sum(decode(subject,'数学', grade,null)) "数学",

sum(decode(subject,'英语', grade,null)) "英语"

from table

group by student

----

语句2

SELECT DEVICE ,

HOUR9,HOUR10,HOUR11,HOUR20,HOUR21,HOUR22,

(HOUR9+HOUR10+HOUR11+HOUR20+HOUR21+HOUR22)/6  BUSY6Avg

FROM 

(

SELECT DEVICE,

SUM(DECODE(TIME_STAMP, TO_CHAR (SYSDATE-1,'YYYY-MM-DD')||' 09:00:00',SGSN_RADIUS,0))  AS HOUR9,

SUM(DECODE(TIME_STAMP, TO_CHAR (SYSDATE-1,'YYYY-MM-DD')||' 10:00:00',SGSN_RADIUS,0)) AS HOUR10,

SUM(DECODE(TIME_STAMP, TO_CHAR (SYSDATE-1,'YYYY-MM-DD')||' 11:00:00',SGSN_RADIUS,0)) AS HOUR11,

SUM(DECODE(TIME_STAMP, TO_CHAR (SYSDATE-1,'YYYY-MM-DD')||' 20:00:00',SGSN_RADIUS,0)) AS HOUR20,

SUM(DECODE(TIME_STAMP, TO_CHAR (SYSDATE-1,'YYYY-MM-DD')||' 21:00:00',SGSN_RADIUS,0)) AS HOUR21,

SUM(DECODE(TIME_STAMP, TO_CHAR (SYSDATE-1,'YYYY-MM-DD')||' 22:00:00',SGSN_RADIUS,0))  AS HOUR22

FROM 

(

SELECT TO_CHAR(REC_TIME, 'yyyy-mm-dd HH24:MI:SS') TIME_STAMP,

                DEVICE,

                ROUND((SUM(rau_betweensgsn_successtimes) +

                      SUM(rau_withinsgsn_successtimes)) /

                      (SUM(rau_betweensgsn_requesttimes) +

                      SUM(rau_withinsgsn_requesttimes)) * 100,

                      2) SGSN_RADIUS

           FROM GPRS_SGSN_6BUSY

          WHERE REC_TIME >=

                TO_DATE('2013-11-06 00:00:00', 'YYYY-MM-DD HH24:MI:SS')

            AND REC_TIME < =

                TO_DATE('2013-11-06 23:59:59', 'YYYY-MM-DD HH24:MI:SS')

          GROUP BY REC_TIME, DEVICE

          ORDER BY REC_TIME

          )

   GROUP BY DEVICE

   )

解锁

--查出oracle当前的被锁对象

SELECT l.session_id sid,

       s.serial#,

       l.locked_mode 锁模式,

       l.oracle_username 登录用户,

       l.os_user_name 登录机器用户名,

       s.machine 机器名,

       s.terminal 终端用户名,

       o.object_name 被锁对象名,

       s.logon_time 登录数据库时间

FROM v$locked_object l, all_objects o, v$session s

WHERE l.object_id = o.object_id

   AND l.session_id = s.sid

ORDER BY sid, s.serial#;

 

--kill掉当前的锁对象可以为

alter system kill session 'sid,s.serial#';

 

SELECT * FROM V$DB_OBJECT_CACHE WHERE  owner='FM' AND NAME LIKE '%FM_RECORD_BAK%' AND LOCKS!='0'

 

创建表空间

create tablespace user_data  

 

logging  

 

datafile 'D:\oracle\oradata\Oracle9i\user_data.dbf' 

 

size 50m  

 

autoextend on  

 

next 50m maxsize 20480m  

 

extent management local; 

行列转换

oracle 10g wmsys.wm_concat行列转换函数的使用 

wm_concat(列名),该函数可以把列值以","号分隔起来,并显示成一行

1、把结果按分组用逗号分割,以一行打印出来。(如果需要换其它的可以用replace函数:replace(wm_concat(name),',','|'))

select t.u_id,

       wmsys.wm_concat(t.goods),

       wmsys.wm_concat(t.goods || '(' || t.u_id || '斤)')

  from tb_index t

 group by t.u_id;


 

2、over(partition by t.u_id)用法:

  select t.u_id,  www.2cto.com  

       wmsys.wm_concat(t.goods || '(' || t.u_id || '斤)') over(partition by t.u_id)

  from tb_index t;

 

 

sys_connect_by_path

select 'select '|| wm_concat('t.'||column_name) || ' from TB_INDEX t' from user_tab_columns where table_name='TB_INDEX';

 

sys_connect_by_path(columnname, seperator) :用来构造树路径的,所以需要和connect by一起来用。

sys_connect_by_path 函数主要作用是可以把一个父节点下的所有子节点通过某个字符进行区分,然后连接在一个列中显示 


select t.areaid,

       t.parentareaid,

       t.areaname,

       sys_connect_by_path(t.areaname, '-') area 

  from tb_index t

 start with t.areaname = '中国'

connect by t.parentareaid = prior t.areaid;


 

 

listagg

11gr2还新增了一个分析函数LISTAGG,这个函数的功能实现字符串的连接

create table t (id number, name varchar2(30), type varchar2(20));

insert into t

  select rownum, object_name, object_type from dba_objects;

select listagg(name, ',') within group(order by id)

  from t

 where rownum < 10;

select type, listagg(name, ',') within group(order by id) name

 from t

where type in ('DIRECTORY', 'JAVA SOURCE', 'SCHEDULE')

group by type;

select name,

       listagg(name, ',') within group(order by id) over(partition by type) s_name

  from t

 where type in ('DIRECTORY', 'JAVA SOURCE', 'SCHEDULE');

 

列转行

1.SQL>select *from t;

2.        IDNAME

3.---------- ----------------

4.         1 0,1,5,2,8,10

5.         2 9,7,8

6.         3 你好,他好,大家好

 

  ID NAME
 ---------- --------
          1 0
          1 1
          1 5
          1 2
          1 8
          1 10
          2 9
          2 7
          2 8
          3 你好
         3 他好
         3 大家好

 

select id,

       substr(name,

              instr(name, ',', 1, rownum) + 1,

              instr(name, ',', 1, rownum + 1) - instr(name, ',', 1, rownum) - 1) name

 

  from (select id, ',' || name || ',' name from test)

 

connect by rownum < length(translate(name, ',' || name, ','));

 

字符串

倒序查找(instr参数传-1

select instr('hgda','a',-1from dual;

select length('123afgha56a789') -

       regexp_instr(reverse('123afgha56a789'), 'a'1) + 1 opt

  from dual;

正则表达式

SELECT LENGTH(REGEXP_REPLACE(REPLACE('123,45,6,5'',''@'), '[^@]+''')) COUNT

  FROM DUAL;

Oracle CASE WHEN 用法介绍

 

 

1. CASE WHEN 表达式有两种形式

--简单Case函数  

CASE sex  

WHEN '1' THEN '男'  

WHEN '2' THEN '女'  

ELSE '其他' END  

--Case搜索函数  

CASE

WHEN sex = '1' THEN '男'  

WHEN sex = '2' THEN '女'  

ELSE '其他' END  

 

2. CASE WHEN 在语句中不同位置的用法

2.1 SELECT CASE WHEN 用法

SELECT   grade, COUNT (CASE WHEN sex = 1 THEN 1      /*sex 1为男生,2位女生*/

                       ELSE NULL

                       END) 男生数,

                COUNT (CASE WHEN sex = 2 THEN 1

                       ELSE NULL

                       END) 女生数

    FROM students GROUP BY grade;

 

2.2 WHERE CASE WHEN 用法

SELECT T2.*, T1.*

   FROM T1, T2

  WHERE (CASE WHEN T2.COMPARE_TYPE = 'A' AND

                   T1.SOME_TYPE LIKE 'NOTHING%'

                THEN 1

              WHEN T2.COMPARE_TYPE != 'A' AND

                   T1.SOME_TYPE NOT LIKE 'NOTHING%'

                THEN 1

              ELSE 0

           END) = 1

 

2.3 GROUP BY CASE WHEN 用法

SELECT  

CASE WHEN salary <= 500 THEN '1'  

WHEN salary > 500 AND salary <= 600  THEN '2'  

WHEN salary > 600 AND salary <= 800  THEN '3'  

WHEN salary > 800 AND salary <= 1000 THEN '4'  

ELSE NULL END salary_class, -- 别名命名

COUNT(*)  

FROM    Table_A  

GROUP BY  

CASE WHEN salary <= 500 THEN '1'  

WHEN salary > 500 AND salary <= 600  THEN '2'  

WHEN salary > 600 AND salary <= 800  THEN '3'  

WHEN salary > 800 AND salary <= 1000 THEN '4'  

ELSE NULL END;  

 

 

3.关于IF-THEN-ELSE的其他实现

 

3.1 DECODE() 函数

select decode(sex, 'M', 'Male', 'F', 'Female', 'Unknown')

from   employees;

貌似只有Oracle提供该函数,而且不支持ANSI SQL,语法上也没CASE WHEN清晰,个人不推荐使用。

 

3.2 在WHERE中特殊实现

SELECT T2.*, T1.*

   FROM T1, T2

  WHERE (T2.COMPARE_TYPE = 'A' AND T1.SOME_TYPE LIKE 'NOTHING%')

         OR

        (T2.COMPARE_TYPE != 'A' AND T1.SOME_TYPE NOT LIKE 'NOTHING%')

 

ORACLE TRUNC函数使用

select  trunc(trunc(sysdate, 'mm')-1,'mm') ,trunc(sysdate, 'mm')  from dual;


1.select trunc(sysdate) from dual  --2011-3-18  今天的日期为2011-3-18
2.select trunc(sysdate, 'mm')   from   dual  --2011-3-1    返回当月第一天.
3.select trunc(sysdate,'yy') from dual  --2011-1-1       返回当年第一天
4.select trunc(sysdate,'dd') from dual  --2011-3-18    返回当前年月日
5.select trunc(sysdate,'yyyy') from dual  --2011-1-1   返回当年第一天
6.select trunc(sysdate,'d') from dual  --2011-3-13 (星期天)返回当前星期的第一天
7.select trunc(sysdate, 'hh') from dual   --2011-3-18 14:00:00   当前时间为14:41  
8.select trunc(sysdate, 'mi') from dual  --2011-3-18 14:41:00   TRUNC()函数没有秒的精确
/***************数字********************/
/*
TRUNCnumber,num_digits
Number 需要截尾取整的数字。
Num_digits 用于指定取整精度的数字。Num_digits 的默认值为 0
TRUNC()函数截取时不进行四舍五入
*/
9.select trunc(123.458) from dual --123
10.select trunc(123.458,0) from dual --123
11.select trunc(123.458,1) from dual --123.4
12.select trunc(123.458,-1) from dual --120
13.select trunc(123.458,-4) from dual --0
14.select trunc(123.458,4) from dual  --123.458
15.select trunc(123) from dual  --123
16.select trunc(123,1) from dual --123
17.select trunc(123,-1) from dual --120  

两个Date类型字段:计算这两个日期的时间差(分别以天,小时,分钟,秒,毫秒):

天:

ROUND(TO_NUMBER(END_DATE - START_DATE))

小时:

ROUND(TO_NUMBER(END_DATE - START_DATE) * 24)

分钟:

ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60)

秒:

ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60 * 60)

毫秒:

ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60 * 60 * 1000)

 

 

 

日期

Oracle

//上个小时,前两个小时

select  to_date(concat(to_char(sysdate, 'yyyy-mm-dd ') ||(to_char(sysdate, 'hh24') - 1),':00:00'), 'yyyy-MM-dd hh24:mi:ss') start_time,

to_date(concat(to_char(sysdate, 'yyyy-mm-dd ') ||(to_char(sysdate, 'hh24') -1),':30:00'), 'yyyy-MM-dd hh24:mi:ss') start_time1,

concat(to_char(sysdate, 'yyyy-mm-dd hh24'), ':00:00') end_time   from dual;

 

select to_date(concat(to_char(sysdate-2/24 , 'yyyy-mm-dd ') ||(to_char(sysdate, 'hh24') - 2),':00:00'),'yyyy-MM-dd hh24:mi:ss') from dual;

 

提前日期:

select  sysdate,sysdate-1 one_date,sysdate-1/24 one_hour,sysdate-1/(60*24) one_minute,sysdate-1/(60*24*60) one_second   from dual

查询前一个月

select concat(to_char(sysdate,'yyyy')||to_char(add_months(sysdate,-1), '-MM-'),'01 00:00:00')start_time,   

concat(to_char(sysdate,'yyyy')||to_char(add_months(sysdate,-1), '-MM-')||to_char(LAST_DAY(sysdate),'dd '),'23:59:59') end_time     from dual

查询前一年

select extract(year from sysdate)-1||'-01-01 00:00:00' start_time,concat(extract(year from sysdate)-1||'-12-'||to_char(LAST_DAY(sysdate),'dd '),'23:59:59') end_time   from dual

 -- 5分钟循环

select trunc(sysdate) +5 / (24 * 60) *floor(extract(minute from timestamp '2001-2-16 2:38:40') / 5)  from dual;

 

 

 

  

SYSBASE 

1: 日期简单语法

查询当前日期起,以时、分、秒、天、周、月、季、年为间隔的日期 

:select convert(char(8),dateadd(hour,1,getdate()),112) 

:select convert(char(8),dateadd(minute,1,getdate()),112) 

:select convert(char(8),dateadd(second,1,getdate()),112) 

:select convert(char(8),dateadd(day,1,getdate()),112) 

:select convert(char(8),dateadd(week,1,getdate()),112) 

:select convert(char(8),dateadd(month,1,getdate()),112) 

:select convert(char(8),dateadd(quarter,1,getdate()),112) 

:select convert(char(8),dateadd(year,1,getdate()),112) 

2:  特定日期

LEFT(convert(char(8),A.TIME_STAMP,112),4)+'-'+right(LEFT(convert(char(8),A.TIME_STAMP,112),6),2)+'-'+ right(LEFT(convert(char(8),A.TIME_STAMP,112),8),2)+' '+convert(char(8),A.TIME_STAMP,108) TIMESTR,

 

上月第一天: 

dselect dateadd(mm,-1,convert(char(8),(datepart(yy,getdate())*10000+datepart(mm,getdate())*100+01))) 

上月最后一天: 

select dateadd(dd,-1,convert(char(8),(datepart(yy,getdate())*10000+datepart(mm,getdate())*100+01))) 

其实就是先取本月第一天,然后分别减一个月和一天就是上月第一天和最后一天 

select datediff(day,'2008-10-1','2008-10-31') 

前一天:

Select CONVERT(CHAR, DATEADD(DAY, -

   1, GETDATE()), 112) ;

SELECT DateAdd(dd, -1, convert(char(8),(datepart(yy,getdate())*10000+datepart(mm,getdate())*100+ datepart(dd,getdate()))))

错误写法:出现’2014-7-0 00:00:00’

convert(datetime ,convert(char(4),datepart(yy,getdate())) ||'-'||convert(char(2),datepart(mm,getdate()))||'-'||convert(char(2),datepart(dd,getdate())-1)||' 00:00:00',111)

 

天一般写法

select LEFT(convert(char(8),getdate(),112),4)+'-'+right(LEFT(convert(char(8),getdate(),112),6),2)+'-'+ right(LEFT(convert(char(8),getdate(),112),8),2) 

select LEFT(convert(char(8),getdate(),112),4)+'-'+right(LEFT(convert(char(8),getdate(),112),6),2)+'-'+ right(LEFT(convert(char(8),dateadd(day,-1,getdate()),112),8),2) 

 

前一小时 

 

(错误写法,小时1-1=0

select convert(char(4),datepart(yy,getdate())) ||'-'||convert(char(2),datepart(mm,getdate()))||

'-'||convert(char(2),datepart(dd,getdate()))||' '||convert(char(2),datepart(hh,getdate())-1)||':00:00'

一般写法

select 

LEFT(convert(char(8),dateadd(hour,0,TIME_STAMP),112),4)+right(LEFT(convert(char(8),dateadd(hour,0,TIME_STAMP),112),6),2)+ right(LEFT(convert(char(8),dateadd(hour,0,TIME_STAMP),112),8),2)+left((convert(char,dateadd(hour,0,TIME_STAMP),108)),2)+'0000' TIME_ID;

 

select LEFT(convert(char(8),dateadd(hour,-3,getdate()),112),4)+'-'+right(LEFT(convert(char(8),dateadd(hour,-3,getdate()),112),6),2)+'-'+ right(LEFT(convert(char(8),dateadd(hour,-3,getdate()),112),8),2)+' '+left((convert(char,dateadd(hour,-3,getdate()),108)),2)+':00:00';

 

 5分钟循环

 SELECT convert(char(2),datepart(MI,getdate())/5*5)

Select convert(char(4),datepart(yy,getdate())) ||'-'||convert(char(2),datepart(mm,getdate()))||

'-'||convert(char(2),datepart(dd,getdate()))||' '||convert(char(2),datepart(hh,getdate())-3)||':'||

convert(char(2),datepart(MI,getdate())/5*5)||':00'

 

取本周第一天,以星期一作为本周第一天 

SELECT @WeekDate = DateAdd(day,1-(Case datepart(dw,Getdate())-1 when 0 then 7 else datepart(dw,GetDate())-1 end),GetDate()) 

SELECT @WeekDate = Convert(varchar,@WeekDate,112) 

得到当前日期的本周最后一天 

SELECT @Date1 = DateAdd(day,7-(Case datepart(dw,@Date1)-1 when 0 then 7 else datepart(dw,@Date1)-1 end),@Date1) 

根据小时判断日结日期,HH>21时,返回当天日期,<21时,返回前一天日期

select case when  datepart(hh,getdate()) >21 then convert(varchar,dateadd(dd,0,convert(datetime,getdate())),112) else convert(varchar,dateadd(dd,-1,convert(datetime,getdate())),112) end 

 

 

 

取时间的某一个部分 

 

select datepart(yy,getdate()) --year 

select datepart(mm,getdate()) --month 

select datepart(dd,getdate()) --day 

select datepart(hh,getdate()) --hour 

select datepart(mi,getdate()) --min 

select datepart(ss,getdate()) --sec 

取星期几 

//该计算出的结果要+1,因其计算出的星期天为一周的第1天,星期六自然就成为一周第7天 

set datefirst 1 

select datepart(weekday,getdate()) --weekday 

 

字符串时间 

select getdate() -- '03/11/12' 

select convert(char,getdate(),101) -- '09/27/2003' 

select convert(char,getdate(),102) -- '2003.11.12' 

select convert(char,getdate(),103) -- '27/09/2003' 

select convert(char,getdate(),104) -- '27.09.2003' 

select convert(char,getdate(),105) -- '27-09-2003' 

select convert(char,getdate(),106) -- '27 Sep 2003' 

select convert(char,getdate(),107) --'Sep 27, 2003' 

select convert(char,getdate(),108) --'11:16:06' 

select convert(char,getdate(),109) --'Sep 27 2003 11:16:28:746AM' 

select convert(char,getdate(),110) --'09-27-2003' 

select convert(char,getdate(),111) --'2003/09/27' 

select convert(char,getdate(),112) --'20030927' 

select rtrim(convert(char,getdate(),102))+' '+(convert(char,getdate(),108)) -- '2003.11.12 11:03:41' 

 

 

整数时间 

select convert(int,convert(char(10),getdate(),112)) -- 20031112 

select datepart(hh,getdate())*10000 + datepart(mi,getdate())*100 + datepart(ss,getdate()) -- 110646 

 

--时间格式 "YYYY.MM.DD HH:MI:SS" 转换为 "YYYYMMDDHHMISS" 

 

declare @a datetime,@tmp varchar(20),@tmp1 varchar(20) 

select @a=convert(datetime,'2004.08.03 12:12:12') 

select @tmp=convert(char(10),@a,112) 

select @tmp 

select @tmp1=convert(char(10),datepart(hh,@a)*10000 + datepart(mi,@a)*100 + datepart(ss,@a)) 

select @tmp1 

select @tmp=@tmp+@tmp1 

select @tmp 

 

当月最后一天 

 

declare 

@tmpstr varchar(10) 

@mm int, 

@premm int, 

@curmmlastday varchar(10) 

begin 

select @mm=datepart(month,getdate())--当月 

select @premm=datepart(month,dateadd(month,-1,getdate())) --上个月 

if (@mm>=1 and @mm<=8) 

select @tmpstr=convert(char(4),datepart(year,getdate()))+'.0'+convert(char(1),datepart(month,dateadd(month,1,getdate())))+'.'+'01' 

else if (@mm>=9 and @mm<=11) 

select @tmpstr=convert(char(4),datepart(year,getdate()))+'.'+convert(char(2),datepart(month,dateadd(month,1,getdate())))+'.'+'01' 

else 

select @tmpstr=convert(char(4),datepart(year,dateadd(year,1,getdate())))+'.0'+convert(char(1),datepart(month,dateadd(month,1,getdate())))+'.'+'01' 

select @curmmlastday=convert(char(10),dateadd(day,-1,@tmpstr),102) --当月最后一天 

end 

 

 

 

关于日期的函数

  dateadd(dd,n,dDate)

解释:返回dDaten的日期 (n可以为负数)

例: select dateadd(dd,2,'2006-12-10')--10号的后2

       返回值:Dec 12 2006 12:00AM

     select dateadd(dd,-1,'2006-12-15')Dec 14 2006 12:00AM

  datediff(day,date1,date2),

解释:date2date1相差的天数,若date2在前,则返回值为负数

例子  select datediff(day,'2006-12-10','2006-11-30')=-10

  getdate() 返回服务器的当时时间

datename(datepart,date) 返回时间的名称 例如     select datename(dy,'2006-2-01')=32/**dy,dayofyear,1-366**/

round(number,n),四舍五入   例如 select round(123.155,2)=123.56

datepart(day,date) 返回当月第一日的差距天数

   例如 datepart(day,'2006-12-15')返回15

        datepart(mm,'2006-12-15')返回12

        datepart(yy,'2006-12-15')返回2006

convert(varchar,datepart(year,@Date1))+'01'+'01'  --取今年第一天

DateAdd(day,-(datepart(day,@Date1)-1),@Date1)  --取当月的第一天

dateadd(day,-1,DateAdd(day, -(datepart(day,dateadd(mm,1,@Date1))-1),dateadd(mm,1,@Date1)))  --取当月的最后一天

dateadd(yy,-1,DateAdd(day,-(datepart(day,@Date1)-1),@Date1)) --取去年当月第一天

dateadd(day,-1,DateAdd(day, -(datepart(day,dateadd(yy,-1,dateadd(mm,1,@Date1)))-1),dateadd(yy,-1,dateadd(mm,1,@Date1))))--取去年当月的最后一天

datename()函数同等于datepart

  3.数学函数  

abs()返回当前数字的绝对值  例如 select abs(-2)=2

avg() 返回某列的平均值  

ceiling   返回大于或等于知道值的最小整数 /**ceilingn.天花板**/2

例如  select ceiling(9.1)=10  select ceiling(-9.1)

count(all|distinct|expression) 计算行数 

  4.字符串函数

Itrim()

  rtrim()返回删去尾随空白的指定表达式

select left('15425',2)='15'

select right('123456',2)='56'

substring('string',n,m)

返回字符串从第n个起长度为m的字符串

例如substring('iloveyou',2,4) 返回'love'

char_length('?????') 返回字符串的长度值例如 char_length('我爱你') 返回6. 中文字符一个占2个字节

char() 返回整数等值字符

count()

REPLICATE   

  以指定的次数重复字符表达式。     

  语法    REPLICATE   (   character_expression   ,   integer_expression   ) ,表达式只能是数字或者能转化为数字的字符串   

例:select Replicate('0','3') 返回 000  , select Replicate('0','-3')  返回null

 

 

Mysql日期

常用语法

STARTTIME >=DATE_FORMAT( DATE_ADD(SYSDATE(), INTERVAL "-4" DAY) ,'%Y-%m-%d 00:00:00') 

STARTTIME < DATE_FORMAT( SYSDATE(), '%Y-%m-%d 00:00:00')

 

取得当天:

SELECT curdate();

mysql> SELECT curdate();
+------------+
| curdate()  |
+------------+
| 2013-07-29 |
+------------+

 

取得当前日期:

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2013-07-29 22:10:40 |
+---------------------+

取得前一天:

mysql> select date_sub(curdate(),interval 1 day);
+------------------------------------+
| date_sub(curdate(),interval 1 day) |
+------------------------------------+
| 2013-07-28                         |
+------------------------------------+

 

括号中为当天时间的前一天,如果统计前几天就将括号中的’1’改成相应的天数。如果要算月或年,直接将day改为month或year即可

 

 取得前一天的年份:

mysql> SELECT YEAR(DATE_SUB(CURDATE(),INTERVAL 1 DAY));
+------------------------------------------+
| YEAR(DATE_SUB(CURDATE(),INTERVAL 1 DAY)) |
+------------------------------------------+
|                                     2013 |
+------------------------------------------+

 

 

 

 date_sub()函数的例子:

今天是2013年5月20日。

date_sub('2012-05-25',interval 1 day) 表示 2012-05-24
date_sub('2012-05-25',interval 0 day) 表示 2012-05-25
date_sub('2012-05-25',interval -1 day) 表示 2012-05-26
date_sub('2012-05-31',interval -1 day) 表示 2012-06-01
date_sub(curdate(),interval 1 day) 表示 2013-05-19
date_sub(curdate(),interval -1 day) 表示 2013-05-21
date_sub(curdate(),interval 1 month) 表示 2013-04-20
date_sub(curdate(),interval -1 month) 表示 2013-06-20
date_sub(curdate(),interval 1 year) 表示 2012-05-20
date_sub(curdate(),interval -1 year) 表示 2014-05-20

 

 select date_add(now(), interval -60 minute);

24小时内记录(即86400秒)

$sql="SELECT video_id,count(id)as n FROM `rec_down` WHERE UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(add_time)<=86400 group by video_id order by n desc ";
$sql="select a.id,a.title,b.n from video_info a,(".$sql.")b where a.id=b.video_id order by n desc limit 20";

N天内记录

WHERE TO_DAYS(NOW()) - TO_DAYS(时间字段) <= N

今天的记录

where date(时间字段)=date(now())

where to_days(时间字段) = to_days(now());

查询一周:

select * from table   where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(column_time);

查询一个月:

select * from table where DATE_SUB(CURDATE(), INTERVAL INTERVAL 1 MONTH) <= date(column_time);

查询选择所有 date_col 值在最后 30 天内的记录。  
mysql> SELECT something FROM tbl_name
           WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;    //真方便,以前都是自己写的,竟然不知道有这,失败.

DAYOFWEEK(date)  
返回 date 的星期索引(1 = Sunday, 2 = Monday, ... 7 = Saturday)。索引值符合 ODBC 的标准。  
mysql> SELECT DAYOFWEEK(’1998-02-03’);
        -> 3

WEEKDAY(date)  
返回 date 的星期索引(0 = Monday, 1 = Tuesday, ... 6 = Sunday):  
mysql> SELECT WEEKDAY(’1998-02-03 22:23:00’);
        -> 1
mysql> SELECT WEEKDAY(’1997-11-05’);
        -> 2

DAYOFMONTH(date)  
返回 date 是一月中的第几天,范围为 到 31:  
mysql> SELECT DAYOFMONTH(’1998-02-03’);
        -> 3

DAYOFYEAR(date)  
返回 date 是一年中的第几天,范围为 到 366:  
mysql> SELECT DAYOFYEAR(’1998-02-03’);
        -> 34

MONTH(date)  
返回 date 中的月份,范围为 到 12:  
mysql> SELECT MONTH(’1998-02-03’);
        -> 2

DAYNAME(date)  
返回 date 的星期名:  
mysql> SELECT DAYNAME("1998-02-05");
        -> ’Thursday’

MONTHNAME(date)  
返回 date 的月份名:  
mysql> SELECT MONTHNAME("1998-02-05");
        -> ’February’

QUARTER(date)  
返回 date 在一年中的季度,范围为 到 4:  
mysql> SELECT QUARTER(’98-04-01’);
        -> 2

WEEK(date)  
WEEK(date,first)  
对于星期日是一周中的第一天的场合,如果函数只有一个参数调用,返回 date 为一年的第几周,返回值范围为 到 53 (是的,可能有第 53 周的开始)。两个参数形式的 WEEK() 允许你指定一周是否以星期日或星期一开始,以及返回值为 0-53 还是 1-52。 这里的一个表显示第二个参数是如何工作的:

值     含义
0     一周以星期日开始,返回值范围为 0-53
1      一周以星期一开始,返回值范围为 0-53
2      一周以星期日开始,返回值范围为 1-53
3      一周以星期一开始,返回值范围为 1-53 (ISO 8601)


mysql> SELECT WEEK(’1998-02-20’);
        -> 7
mysql> SELECT WEEK(’1998-02-20’,0);
        -> 7
mysql> SELECT WEEK(’1998-02-20’,1);
        -> 8
mysql> SELECT WEEK(’1998-12-31’,1);
        -> 53

mysql> SELECT YEARWEEK(’2000-01-01’);
        -> 199952
mysql> SELECT MID(YEARWEEK(’2000-01-01’),5,2);
        -> 52

YEAR(date)
返回 date 的年份,范围为 1000 到 9999
mysql> SELECT YEAR(’98-02-03’);
        -> 1998

YEARWEEK(date)
YEARWEEK(date,first)
返回一个日期值是的哪一年的哪一周。第二个参数的形式与作用完全与 WEEK() 的第二个参数一致。注意,对于给定的日期参数是一年的第一周或最后一周的,返回的年份值可能与日期参数给出的年份不一致:
mysql> SELECT YEARWEEK(’1987-01-01’);
        -> 198653

注意,对于可选参数 或 1,周值的返回值不同于 WEEK() 函数所返回值(0), WEEK() 根据给定的年语境返回周值。
HOUR(time)
返回 time 的小时值,范围为 到 23
mysql> SELECT HOUR(’10:05:03’);
        -> 10

MINUTE(time)
返回 time 的分钟值,范围为 到 59
mysql> SELECT MINUTE(’98-02-03 10:05:03’);
        -> 5

SECOND(time)
返回 time 的秒值,范围为 到 59
mysql> SELECT SECOND(’10:05:03’);
        -> 3

PERIOD_ADD(P,N)
增加 个月到时期 P(格式为 YYMM 或 YYYYMM)中。以 YYYYMM 格式返回值。 注意,期间参数 不是一个日期值:
mysql> SELECT PERIOD_ADD(9801,2);
        -> 199803

PERIOD_DIFF(P1,P2)
返回时期 P1 和 P2 之间的月数。P1 和 P2 应该以 YYMM 或 YYYYMM 指定。 注意,时期参数 P1 和 P2 不是日期值:
mysql> SELECT PERIOD_DIFF(9802,199703);
        -> 11

DATE_ADD(date,INTERVAL expr type)
DATE_SUB(date,INTERVAL expr type)
ADDDATE(date,INTERVAL expr type)
SUBDATE(date,INTERVAL expr type)
这些函数执行日期的算术运算。ADDDATE() 和 SUBDATE() 分别是 DATE_ADD() 和 DATE_SUB() 的同义词。 在 MySQL 3.23 中,如果表达式的右边是一个日期值或一个日期时间型字段,你可以使用 和 代替 DATE_ADD() 和 DATE_SUB()(示例如下)。 参数 date 是一个 DATETIME 或 DATE 值,指定一个日期的开始。expr 是一个表达式,指定从开始日期上增加还是减去间隔值。expr 是一个字符串;它可以以一个 “-” 领头表示一个负的间隔值。type 是一个关键词,它标志着表达式以何格式被解释。

 

 


(2)getdate(时间)
返回一个哈希表,各下标是:
"seconds" -- 秒数
"minutes" -- 分数
"hours" -- 小时数
"mday" -- 日数
"mon" -- 月份数
"year" -- 年号
"yday" -- 11日以来的天数
"weekday" -- 星期几,英文全称
"month" -- 月份,英文全名
(3)gmdate
date类似,但先将时间转换成格林威治标准时.

(4)mktime
用法:
mktime(小时数,分数,秒数,,,); 返回一个时间值,可用于其他函数.
 
(5)time
用法:
time(); 返回197011日零点以来的秒数.
 
(6)microtime
用法:
microtime(); 返回一个字符串,用空格分成两部分,后一部分相当于time()
的返回值,前一部分是微秒数.
(7)checkdate
checkdate(,,); 返回逻辑真或逻辑假如果:
年在190032767之间(包括190032767);
月在112之间;
日在该月的允许日数范围内(考虑了闰年);
则返回逻辑真.

 

mysql日期格式化

DATE_FORMA T(date, format) 根据格式串format 格式化日期或日期和时间值date,返回结果串。

  可用DATE_FORMAT( ) 来格式化DATE 或DATETIME 值,以便得到所希望的格式。根据format字符串格式化date值:

  %S, %s 两位数字形式的秒( 00,01, . . ., 59)

  %i 两位数字形式的分( 00,01, . . ., 59)

  %H 两位数字形式的小时,24 小时(00,01, . . ., 23)

  %h, %I 两位数字形式的小时,12 小时(01,02, . . ., 12)

  %k 数字形式的小时,24 小时(0,1, . . ., 23)

  %l 数字形式的小时,12 小时(1, 2, . . ., 12)

  %T 24 小时的时间形式(h h : m m : s s)

  %r 12 小时的时间形式(hh:mm:ss AM 或hh:mm:ss PM)

  %p AM 或P M

  %W 一周中每一天的名称( S u n d a y, Monday, . . ., Saturday)

  %a 一周中每一天名称的缩写( Sun, Mon, . . ., Sat)

  %d 两位数字表示月中的天数( 00, 01, . . ., 31)

  %e 数字形式表示月中的天数( 1, 2, . . ., 31)

 %D 英文后缀表示月中的天数( 1st, 2nd, 3rd, . . .)

  %w 以数字形式表示周中的天数( 0 = S u n d a y, 1=Monday, . . ., 6=Saturday)

  %j 以三位数字表示年中的天数( 001, 002, . . ., 366)

  % U 周(0, 1, 52),其中Sunday 为周中的第一天

  %u 周(0, 1, 52),其中Monday 为周中的第一天

  %M 月名(J a n u a r y, February, . . ., December)

  %b 缩写的月名( J a n u a r y, February, . . ., December)

  %m 两位数字表示的月份( 01, 02, . . ., 12)

  %c 数字表示的月份( 1, 2, . . ., 12)

  %Y 四位数字表示的年份

  %y 两位数字表示的年份

  %% 直接值“%”

  select date_format(日期字段,’%Y-%m-%d’) as ‘日期’ from test

单位转换

流量(GB)=流入流速(bps)*3600/1024/1024/1024/8

Byte、bit:

    bit表示:位,是计算机中最小的数据单位。每一位的状态只能是0或1

    Byte表示:字节,8个二进制位构成1个字节,即1 Byte = 8 bit 。1个英文字母或者数字占用1个字节的空间,1个汉字占据2个字节的空间。

 

    KB、MB、GB、TB、PB:

    这些单位中,B表示Byte,这些单位也常简写为:K、M、G、T、P;

    1 KB = 1024 Byte;1 MB = 1024 KB;1 GB = 1024 MB;1 TB = 1024 MB;1 PB = 1024 TB;

    也就是说1K = 1024 = ;1M = 1024 K = ;1G =  ……

    注:在日常10进制中,K表示1000,如1Km = 1000米,即,1K = ;1M = ;1G = ……

 

    MHz、GHz:

    用来表示频率,Hz即赫兹,M、G的意思同上

 

    Bps、bps:

    注意虽然只是大小写不同,两者是完全不同的,前者是Byte per second,即字节/秒;后者是bit per second,即位/秒。

    如家用的2M宽带,也就是2M bps,换成Bps也就是(2M/8 )Bps = 256K Bps,所以我们用2M宽带下载时的最大下载速度就是256KB左右。

    我们平常所说的百兆、千兆网卡,其单位就是bps,而非Bps。

 

    GT/s、GB/s:

    常用来描述计算机内部总线的传输速度

    GT/s:giga transfers per second,可以通俗的理解为“G次/秒”,表示传输速度。如Core i7 QPI总线传输速度可以达到4.8GT/s,HT 3.0总线可以达到5.2GT/s,也就是说QPI总线每秒可以传输4.8G次,HT 3.0总线则是每秒5.2G次。

    GB/s:即G Byte/s,如QPI总线的带宽是25.6GB/s,即每秒能传输25.6G字节。

    两者间的换算:比如1333MHz的FSB,每秒传输1333M(1.333G)次,每次传输64 bit数据,也就是8 Byte,所以它的传输带宽就是1.333*8=10.7GB/S。双通道的DDR2-667的峰值也是10.7GB/S,刚好匹配。

再比如。6.4GT/S的QPI总线,QPI数据包是80 bit的长度,其中64 bit用于数据,发送需要用4个周期,所以它一次只能传输64/4/8=2字节,所以其理论最大值就可以达到6.4*2=12.8GB/S(单向),双向则是25.6GB/S

NULL

!=null 与 is not null 区别

MYSQL

MySQL:日期函数、时间函数总结(MySQL 5.X

 

用了date_format后在程序中查询出的结果为System.Byte[],而在数据库中查正常

解决办法为:加Convert转换编码

Sql代码  

select Convert(date_format(datetime, '%Y-%m-%d') using utf8) as datetime form tb  

select Convert(date_format(datetime, '%Y-%m-%d') using utf8) as datetime form tb

 

原文:http://www.51sdj.com/phpcms/picture/2009/0711/picture_133.html

20081118日 15:37
一、MySQL 获得当前日期时间 函数
1.1 获得当前日期+时间(date + time)函数:now()
mysql> select now();

+---------------------+
| now() |
+---------------------+
| 2008-08-08 22:20:46 |
+---------------------+

除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数:
current_timestamp()
,current_timestamp
,localtime()
,localtime
,localtimestamp -- (v4.0.6)
,localtimestamp() -- (v4.0.6)

这些日期时间函数,都等同于 now()。鉴于 now() 函数简短易记,建议总是使用 now() 来替代上面列出的函数。
1.2 获得当前日期+时间(date + time)函数:sysdate()
sysdate() 日期时间函数跟 now() 类似,不同之处在于:now() 在执行开始时值就得到了, sysdate() 在函数执行时动态得到值。看下面的例子就明白了:
mysql> select now(), sleep(3), now();

+---------------------+----------+---------------------+
| now() | sleep(3) | now() |
+---------------------+----------+---------------------+
| 2008-08-08 22:28:21 | 0 | 2008-08-08 22:28:21 |
+---------------------+----------+---------------------+

mysql> select sysdate(), sleep(3), sysdate();

+---------------------+----------+---------------------+
| sysdate() | sleep(3) | sysdate() |
+---------------------+----------+---------------------+
| 2008-08-08 22:28:41 | 0 | 2008-08-08 22:28:44 |
+---------------------+----------+---------------------+

可以看到,虽然中途 sleep 3 秒,但 now() 函数两次的时间值是相同的; sysdate() 函数两次得到的时间值相差 秒。MySQL Manual 中是这样描述 sysdate() 的:Return the time at which the function executes
sysdate() 日期时间函数,一般情况下很少用到。
2. 获得当前日期(date)函数:curdate()
mysql> select curdate();

+------------+
| curdate() |
+------------+
| 2008-08-08 |
+------------+

其中,下面的两个日期函数等同于 curdate()
current_date()
,current_date

3. 获得当前时间(time)函数:curtime()
mysql> select curtime();

+-----------+
| curtime() |
+-----------+
| 22:41:30 |
+-----------+

其中,下面的两个时间函数等同于 curtime()
current_time()
,current_time

4. 获得当前 UTC 日期时间函数:utc_date(), utc_time(), utc_timestamp()
mysql> select utc_timestamp(), utc_date(), utc_time(), now()

+---------------------+------------+------------+---------------------+
| utc_timestamp() | utc_date() | utc_time() | now() |
+---------------------+------------+------------+---------------------+
| 2008-08-08 14:47:11 | 2008-08-08 | 14:47:11 | 2008-08-08 22:47:11 |
+---------------------+------------+------------+---------------------+

因为我国位于东八时区,所以本地时间 = UTC 时间 + 8 小时。UTC 时间在业务涉及多个国家和地区的时候,非常有用。

二、MySQL 日期时间 Extract(选取) 函数。
1. 选取日期时间的各个部分:日期、时间、年、季度、月、日、小时、分钟、秒、微秒
set @dt = '2008-09-10 07:15:30.123456';

select date(@dt); -- 2008-09-10
select time(@dt); -- 07:15:30.123456
select year(@dt); -- 2008
select quarter(@dt); -- 3
select month(@dt); -- 9
select week(@dt); -- 36
select day(@dt); -- 10
select hour(@dt); -- 7
select minute(@dt); -- 15
select second(@dt); -- 30
select microsecond(@dt); -- 123456

2. MySQL Extract() 函数,可以上面实现类似的功能:
set @dt = '2008-09-10 07:15:30.123456';

select extract(year from @dt); -- 2008
select extract(quarter from @dt); -- 3
select extract(month from @dt); -- 9
select extract(week from @dt); -- 36
select extract(day from @dt); -- 10
select extract(hour from @dt); -- 7
select extract(minute from @dt); -- 15
select extract(second from @dt); -- 30
select extract(microsecond from @dt); -- 123456

select extract(year_month from @dt); -- 200809
select extract(day_hour from @dt); -- 1007
select extract(day_minute from @dt); -- 100715
select extract(day_second from @dt); -- 10071530
select extract(day_microsecond from @dt); -- 10071530123456
select extract(hour_minute from @dt); -- 715
select extract(hour_second from @dt); -- 71530
select extract(hour_microsecond from @dt); -- 71530123456
select extract(minute_second from @dt); -- 1530
select extract(minute_microsecond from @dt); -- 1530123456
select extract(second_microsecond from @dt); -- 30123456

MySQL Extract() 函数除了没有date(),time() 的功能外,其他功能一应具全。并且还具有选取‘day_microsecond’ 等功能。注意这里不是只选取 day 和 microsecond,而是从日期的 day 部分一直选取到 microsecond 部分。够强悍的吧!
MySQL Extract() 函数唯一不好的地方在于:你需要多敲几次键盘。
3. MySQL dayof... 函数:dayofweek(), dayofmonth(), dayofyear()
分别返回日期参数,在一周、一月、一年中的位置。
set @dt = '2008-08-08';

select dayofweek(@dt); -- 6
select dayofmonth(@dt); -- 8
select dayofyear(@dt); -- 221

日期 '2008-08-08' 是一周中的第 天(1 = Sunday, 2 = Monday, ..., 7 = Saturday);一月中的第 天;一年中的第 221 天。
4. MySQL week... 函数:week(), weekofyear(), dayofweek(), weekday(), yearweek()
set @dt = '2008-08-08';

select week(@dt); -- 31
select week(@dt,3); -- 32
select weekofyear(@dt); -- 32

select dayofweek(@dt); -- 6
select weekday(@dt); -- 4

select yearweek(@dt); -- 200831

MySQL week() 函数,可以有两个参数,具体可看手册。 weekofyear() 和 week() 一样,都是计算“某天”是位于一年中的第几周。 weekofyear(@dt) 等价于 week(@dt,3)
MySQL weekday() 函数和 dayofweek() 类似,都是返回“某天”在一周中的位置。不同点在于参考的标准, weekday(0 = Monday, 1 = Tuesday, ..., 6 = Sunday); dayofweek:(1 = Sunday, 2 = Monday, ..., 7 = Saturday
MySQL yearweek() 函数,返回 year(2008) + week 位置(31)
5. MySQL 返回星期和月份名称函数:dayname(), monthname()
set @dt = '2008-08-08';

select dayname(@dt); -- Friday
select monthname(@dt); -- August

思考,如何返回中文的名称呢?
6. MySQL last_day() 函数:返回月份中的最后一天。
select last_day('2008-02-01'); -- 2008-02-29
select last_day('2008-08-08'); -- 2008-08-31

MySQL last_day() 函数非常有用,比如我想得到当前月份中有多少天,可以这样来计算:
mysql> select now(), day(last_day(now())) as days;

+---------------------+------+
| now() | days |
+---------------------+------+
| 2008-08-09 11:45:45 | 31 |
+---------------------+------+

三、MySQL 日期时间计算函数
1. MySQL 为日期增加一个时间间隔:date_add()
set @dt = now();

select date_add(@dt, interval 1 day); -- add 1 day
select date_add(@dt, interval 1 hour); -- add 1 hour
select date_add(@dt, interval 1 minute); -- ...
select date_add(@dt, interval 1 second);
select date_add(@dt, interval 1 microsecond);
select date_add(@dt, interval 1 week);
select date_add(@dt, interval 1 month);
select date_add(@dt, interval 1 quarter);
select date_add(@dt, interval 1 year);

select date_add(@dt, interval -1 day); -- sub 1 day

MySQL adddate(), addtime()函数,可以用 date_add() 来替代。下面是 date_add() 实现 addtime() 功能示例:
mysql> set @dt = '2008-08-09 12:12:33';

mysql>
mysql> select date_add(@dt, interval '01:15:30' hour_second);

+------------------------------------------------+
| date_add(@dt, interval '01:15:30' hour_second) |
+------------------------------------------------+
| 2008-08-09 13:28:03 |
+------------------------------------------------+

mysql> select date_add(@dt, interval '1 01:15:30' day_second);

+-------------------------------------------------+
| date_add(@dt, interval '1 01:15:30' day_second) |
+-------------------------------------------------+
| 2008-08-10 13:28:03 |
+-------------------------------------------------+

date_add() 函数,分别为 @dt 增加了“1小时 15分 30秒” 和 “1天 1小时 15分 30秒”。建议:总是使用 date_add() 日期时间函数来替代 adddate(), addtime()
2. MySQL 为日期减去一个时间间隔:date_sub()
mysql> select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);

+----------------------------------------------------------------+
| date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second) |
+----------------------------------------------------------------+
| 1997-12-30 22:58:59 |
+----------------------------------------------------------------+

MySQL date_sub() 日期时间函数 和 date_add() 用法一致,不再赘述。另外,MySQL 中还有两个函数 subdate(), subtime(),建议,用 date_sub() 来替代。
3. MySQL 另类日期函数:period_add(P,N), period_diff(P1,P2)
函数参数“P” 的格式为“YYYYMM” 或者 “YYMM”,第二个参数“N” 表示增加或减去 N month(月)。
MySQL period_add(P,N):日期加/减去N月。
mysql> select period_add(200808,2), period_add(20080808,-2)

+----------------------+-------------------------+
| period_add(200808,2) | period_add(20080808,-2) |
+----------------------+-------------------------+
| 200810 | 20080806 |
+----------------------+-------------------------+

MySQL period_diff(P1,P2):日期 P1-P2,返回 个月。
mysql> select period_diff(200808, 200801);

+-----------------------------+
| period_diff(200808, 200801) |
+-----------------------------+
| 7 |
+-----------------------------+

在 MySQL 中,这两个日期函数,一般情况下很少用到。
4. MySQL 日期、时间相减函数:datediff(date1,date2), timediff(time1,time2)
MySQL datediff(date1,date2):两个日期相减 date1 - date2,返回天数。
select datediff('2008-08-08', '2008-08-01'); -- 7
select datediff('2008-08-01', '2008-08-08'); -- -7

MySQL timediff(time1,time2):两个日期相减 time1 - time2,返回 time 差值。
select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08
select timediff('08:08:08', '00:00:00'); -- 08:08:08

注意:timediff(time1,time2) 函数的两个参数类型必须相同。

四、MySQL 日期转换函数、时间转换函数
1. MySQL (时间、秒)转换函数:time_to_sec(time), sec_to_time(seconds)
select time_to_sec('01:00:05'); -- 3605
select sec_to_time(3605); -- '01:00:05'

2. MySQL (日期、天数)转换函数:to_days(date), from_days(days)
select to_days('0000-00-00'); -- 0
select to_days('2008-08-08'); -- 733627

select from_days(0); -- '0000-00-00'
select from_days(733627); -- '2008-08-08'

3. MySQL Str to Date (字符串转换为日期)函数:str_to_date(str, format)
select str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09
select str_to_date('08/09/08' , '%m/%d/%y'); -- 2008-08-09
select str_to_date('08.09.2008', '%m.%d.%Y'); -- 2008-08-09
select str_to_date('08:09:30', '%h:%i:%s'); -- 08:09:30
select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30

可以看到,str_to_date(str,format) 转换函数,可以把一些杂乱无章的字符串转换为日期格式。另外,它也可以转换为时间。“format” 可以参看 MySQL 手册。
4. MySQL Date/Time to Str(日期/时间转换为字符串)

函数:date_format(date,format), time_format(time,format)
mysql> select date_format('2008-08-08 22:23:00', '%W %M %Y');

+------------------------------------------------+
| date_format('2008-08-08 22:23:00', '%W %M %Y') |
+------------------------------------------------+
| Friday August 2008 |
+------------------------------------------------+

mysql> select date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s');

+----------------------------------------------------+
| date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s') |
+----------------------------------------------------+
| 20080808222301 |
+----------------------------------------------------+

mysql> select time_format('22:23:01', '%H.%i.%s');

+-------------------------------------+
| time_format('22:23:01', '%H.%i.%s') |
+-------------------------------------+
| 22.23.01 |
+-------------------------------------+

MySQL 日期、时间转换函数:date_format(date,format), time_format(time,format) 能够把一个日期/时间转换成各种各样的字符串格式。它是 str_to_date(str,format) 函数的 一个逆转换。
5. MySQL 获得国家地区时间格式函数:get_format()
MySQL get_format() 语法:
get_format(date|time|datetime, 'eur'|'usa'|'jis'|'iso'|'internal'

MySQL get_format() 用法的全部示例:
select get_format(date,'usa') ; -- '%m.%d.%Y'
select get_format(date,'jis') ; -- '%Y-%m-%d'
select get_format(date,'iso') ; -- '%Y-%m-%d'
select get_format(date,'eur') ; -- '%d.%m.%Y'
select get_format(date,'internal') ; -- '%Y%m%d'
select get_format(datetime,'usa') ; -- '%Y-%m-%d %H.%i.%s'
select get_format(datetime,'jis') ; -- '%Y-%m-%d %H:%i:%s'
select get_format(datetime,'iso') ; -- '%Y-%m-%d %H:%i:%s'
select get_format(datetime,'eur') ; -- '%Y-%m-%d %H.%i.%s'
select get_format(datetime,'internal') ; -- '%Y%m%d%H%i%s'
select get_format(time,'usa') ; -- '%h:%i:%s %p'
select get_format(time,'jis') ; -- '%H:%i:%s'
select get_format(time,'iso') ; -- '%H:%i:%s'
select get_format(time,'eur') ; -- '%H.%i.%s'
select get_format(time,'internal') ; -- '%H%i%s'

MySQL get_format() 函数在实际中用到机会的比较少。
6. MySQL 拼凑日期、时间函数:makdedate(year,dayofyear), maketime(hour,minute,second)
select makedate(2001,31); -- '2001-01-31'
select makedate(2001,32); -- '2001-02-01'

select maketime(12,15,30); -- '12:15:30'

五、MySQL 时间戳(Timestamp)函数
1. MySQL 获得当前时间戳函数:current_timestamp, current_timestamp()
mysql> select current_timestamp, current_timestamp();

+---------------------+---------------------+
| current_timestamp | current_timestamp() |
+---------------------+---------------------+
| 2008-08-09 23:22:24 | 2008-08-09 23:22:24 |
+---------------------+---------------------+

2. MySQL Unix 时间戳、日期)转换函数:
unix_timestamp(),
unix_timestamp(date),
from_unixtime(unix_timestamp),
from_unixtime(unix_timestamp,format)

下面是示例:
select unix_timestamp(); -- 1218290027
select unix_timestamp('2008-08-08'); -- 1218124800
select unix_timestamp('2008-08-08 12:30:00'); -- 1218169800

select from_unixtime(1218290027); -- '2008-08-09 21:53:47'
select from_unixtime(1218124800); -- '2008-08-08 00:00:00'
select from_unixtime(1218169800); -- '2008-08-08 12:30:00'

select from_unixtime(1218169800, '%Y %D %M %h:%i:%s %x'); -- '2008 8th August 12:30:00 2008'

3. MySQL 时间戳(timestamp)转换、增、减函数:
timestamp(date) -- date to timestamp
timestamp(dt,time) -- dt + time
timestampadd(unit,interval,datetime_expr) --
timestampdiff(unit,datetime_expr1,datetime_expr2) --

请看示例部分:
select timestamp('2008-08-08'); -- 2008-08-08 00:00:00
select timestamp('2008-08-08 08:00:00', '01:01:01'); -- 2008-08-08 09:01:01
select timestamp('2008-08-08 08:00:00', '10 01:01:01'); -- 2008-08-18 09:01:01

select timestampadd(day, 1, '2008-08-08 08:00:00'); -- 2008-08-09 08:00:00
select date_add('2008-08-08 08:00:00', interval 1 day); -- 2008-08-09 08:00:00

MySQL timestampadd() 函数类似于 date_add()
select timestampdiff(year,'2002-05-01','2001-01-01'); -- -1
select timestampdiff(day ,'2002-05-01','2001-01-01'); -- -485
select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00'); -- -12

select datediff('2008-08-08 12:00:00', '2008-08-01 00:00:00'); -- 7

MySQL timestampdiff() 函数就比 datediff() 功能强多了,datediff() 只能计算两个日期(date)之间相差的天数。

六、MySQL 时区(timezone)转换函数
convert_tz(dt,from_tz,to_tz)

select convert_tz('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00

时区转换也可以通过 date_add, date_sub, timestampadd 来实现。
select date_add('2008-08-08 12:00:00', interval -8 hour); -- 2008-08-08 04:00:00
select date_sub('2008-08-08 12:00:00', interval 8 hour); -- 2008-08-08 04:00:00
select timestampadd(hour, -8, '2008-08-08 12:00:00'); -- 2008-08-08 04:00:00

SYBASE

TOP用法

(1)select top 10 * from user order by id
(2)set rowcount 10 select * from user order by id set rowcount 0

 

SYBASE函数

1字符串

select  substring(stuff(objectName,charindex('-SYS',objectName),4,'1'),9,4) from PPM_Wap_KPI

2 isnull

select isnull(TYPE, 'UNKNOWN')

3 nullif

nullif(value1,value2)

解释: case when value1=value2 then null

       else value1 

       end 

   例: select nullif(2,2)

   返回值: null

       select nullif(1,2)

        返回值: 1

注意:value1何value2的数据类型必须兼容

isnull(value1,value2)

case when value1=null then value2 else value1 end

例:select isnull(null,0)=0

     select isnull(2,0)=2

 

Sybase游标使用

CREATE PROCEDURE dbo.SP_NHM_CMNET_LINK_CITY_UPDATE

AS

    BEGIN

DECLARE @V_CUSTOM_NAMEVARCHAR(255)

DECLARE CUR_TMP CURSOR FOR SELECT LINK_UUID FROM dbo.NHM_CMNET_LINK_CITY

OPEN  CUR_TMP 

 

FETCH CUR_TMP  into @V_CUSTOM_NAME

    if (@@sqlstatus = 2) 

begin 

CLOSE CUR_TMP 

DEALLOCATE CURSOR CUR_TMP 

return -1 

    end 

    

 while(@@sqlstatus = 0) 

BEGIN

    update dbo.NHM_CMNET_LINK_CITY  set LINK_NAME=

     (

       select LINK_NAME from dbo.TM_LINK_INFORMATION where LINK_UUID=@V_CUSTOM_NAME

     ) where LINK_UUID=@V_CUSTOM_NAME

   commit

FETCH CUR_TMP  into @V_CUSTOM_NAME

   END

END

Sybase GetLile存储

CREATE PROCEDURE GetDataByLine

(

  --创建一个分页读取过程

  @SqlStr         varchar(16384), --SQL语句

  @FirstRec       int,  --页起始行

  @LastRec        int  --页结束行

)

AS

  DECLARE @dt varchar(10) --生成临时表的随机数

BEGIN

  --减少临时行结果

  set r                                    owcount @LastRec

  SELECT @dt= substring(convert(varchar, rand()), 3, 10) --一个字符型的随机数

  --将搜索结果放入临时表中,表名随机生成,在' FROM '前插入'INTO '+随机临时表名

  SELECT @SqlStr = stuff(@SqlStr, charindex(' FROM ', upper(@SqlStr)), 6 ,' INTO                                       tempdb..Lining' + @dt + ' FROM ')

  EXECUTE (@SqlStr)

  --为临时表增加id

  SELECT @SqlStr = 'ALTER TABLE tempdb..Lining' + @dt + ' ADD TEMPDB_ID numeric(10) IDENTITY PRIMARY KEY'

  EXECUTE (@SqlStr)

  --计算临时表中              的记录数

  --SELECT @Sql                 Str = 'SELECT Count(*) From tempdb..Lining' + @dt

  --EXECUTE (@SqlStr)

  --选取记录号在起始行和结束行中间的记录

  SELECT @SqlStr = 'SELECT * FROM tempdb..Lining'+@dt+' WHERE TEMPDB_ID > ' + convert(varchar, @FirstRec) + 

                  ' and TEMPDB_ID                   <= ' + convert(varchar, @LastRec)

  EXECUTE (@SqlStr)

  --删除临时表

  SELECT @SqlStr = 'DROP TABLE tempdb..Lining'+@dt

  EXECUTE (@SqlStr)

END

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值