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',-1) from 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()函数没有秒的精确
/***************数字********************/
/*
TRUNC(number,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)
解释:返回dDate后n的日期 (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),
解释:date2与date1相差的天数,若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 返回大于或等于知道值的最小整数 /**ceiling,n.天花板, 最**/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 ) ,表达式2 只能是数字或者能转化为数字的字符串
例: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 是一月中的第几天,范围为 1 到 31:
mysql> SELECT DAYOFMONTH(’1998-02-03’);
-> 3
DAYOFYEAR(date)
返回 date 是一年中的第几天,范围为 1 到 366:
mysql> SELECT DAYOFYEAR(’1998-02-03’);
-> 34
MONTH(date)
返回 date 中的月份,范围为 1 到 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 在一年中的季度,范围为 1 到 4:
mysql> SELECT QUARTER(’98-04-01’);
-> 2
WEEK(date)
WEEK(date,first)
对于星期日是一周中的第一天的场合,如果函数只有一个参数调用,返回 date 为一年的第几周,返回值范围为 0 到 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
注意,对于可选参数 0 或 1,周值的返回值不同于 WEEK() 函数所返回值(0), WEEK() 根据给定的年语境返回周值。
HOUR(time)
返回 time 的小时值,范围为 0 到 23:
mysql> SELECT HOUR(’10:05:03’);
-> 10
MINUTE(time)
返回 time 的分钟值,范围为 0 到 59:
mysql> SELECT MINUTE(’98-02-03 10:05:03’);
-> 5
SECOND(time)
返回 time 的秒值,范围为 0 到 59:
mysql> SELECT SECOND(’10:05:03’);
-> 3
PERIOD_ADD(P,N)
增加 N 个月到时期 P(格式为 YYMM 或 YYYYMM)中。以 YYYYMM 格式返回值。 注意,期间参数 P 不是一个日期值:
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" -- 1月1日以来的天数
"weekday" -- 星期几,英文全称
"month" -- 月份,英文全名
(3)gmdate
与date类似,但先将时间转换成格林威治标准时.
(4)mktime
用法:
mktime(小时数,分数,秒数,月,日,年); 返回一个时间值,可用于其他函数.
(5)time
用法:
time(); 返回1970年1月1日零点以来的秒数.
(6)microtime
用法:
microtime(); 返回一个字符串,用空格分成两部分,后一部分相当于time()
的返回值,前一部分是微秒数.
(7)checkdate
checkdate(月,日,年); 返回逻辑真或逻辑假. 如果:
年在1900和32767之间(包括1900与32767);
月在1到12之间;
日在该月的允许日数范围内(考虑了闰年);
则返回逻辑真.
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转换编码
1 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
2008年11月18日 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() 函数两次得到的时间值相差 3 秒。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' 是一周中的第 6 天(1 = Sunday, 2 = Monday, ..., 7 = Saturday);一月中的第 8 天;一年中的第 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,返回 N 个月。
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