筆記來自如鵬網楊中科老師所著的 《程序員的SQL金典》程序員
1、日期時間函數: 數據庫
日期時間類型分爲 日期、時間、日期時間、時間戳
日期:"年-月-日" 沒有時間分秒 數據庫中用 Date
時間:"小時:分鐘:秒" 數據庫中用 Time
日期時間:"年-月-日 小時:分鐘:秒" 數據庫中用DateTime
時間戳 : 詳解 http://www.jb51.net/article/51794.htm
1)、取得當前日期時間:
A: MySQL:
Now():當前的日期時間。別名:SysDate()、 Current_TimeStamp()
CurDate():不包括時間部分的當前日期。 別名:Current_Date()
CurTime():不包括日期部分的當前時間。別名:Current_Time()
B: MSSQLServer:
GetDate() 取得當前時間 返回的包括了:日期、時間(精確到秒之後部分)的時間戳。
MSSQLServer沒有專門的取得當前時間的函數。可是能夠經過Convert()函數處理。
select GETDATE() as 當前日期時間 年-月-日 小時:分鐘:秒....
select CONVERT(VARCHAR(50) ,GETDATE( ), 101) as 當前日期 年-月-日
select CONVERT(VARCHAR(50) ,GETDATE(), 108) as 當前時間 小時:分鐘:秒ide
2、日期增減函數
所需表及數據執行腳本:spa
CREATE TABLE STUDENT (SNO VARCHAR(3) NOT NULL, SNAME VARCHAR(4) NOT NULL, SSEX VARCHAR(2) NOT NULL, SBIRTHDAY DATETIME, CLASS VARCHAR(5)) go CREATE TABLE COURSE (CNO VARCHAR(5) NOT NULL, CNAME VARCHAR(10) NOT NULL, TNO VARCHAR(10) NOT NULL) go CREATE TABLE SCORE (SNO VARCHAR(3) NOT NULL, CNO VARCHAR(5) NOT NULL, DEGREE NUMERIC(10, 1) NOT NULL) go CREATE TABLE TEACHER (TNO VARCHAR(3) NOT NULL, TNAME VARCHAR(4) NOT NULL, TSEX VARCHAR(2) NOT NULL, TBIRTHDAY DATETIME NOT NULL, PROF VARCHAR(6), DEPART VARCHAR(10) NOT NULL) go CREATE TABLE [GRADE]( [low] [numeric](3, 0) NULL, [up] [numeric](3, 0) NULL, [rank] [char](1) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY] GO INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (108 ,'曾華' ,'男' ,1977-09-01,95033); INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (105 ,'匡明' ,'男' ,1975-10-02,95031); INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (107 ,'王麗' ,'女' ,1976-01-23,95033); INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (101 ,'李軍' ,'男' ,1976-02-20,95033); INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (109 ,'王芳' ,'女' ,1975-02-10,95031); INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (103 ,'陸君' ,'男' ,1974-06-03,95031); GO INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('3-105' ,'計算機導論',825) INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('3-245' ,'操做系統' ,804); INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('6-166' ,'數據電路' ,856); INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('9-888' ,'高等數學' ,100); GO INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-245',86); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,'3-245',75); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,'3-245',68); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-105',92); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,'3-105',88); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,'3-105',76); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,'3-105',64); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,'3-105',91); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'3-105',78); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,'6-166',85); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,'6-106',79); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'6-166',81); GO INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (804,'李誠','男','1958-12-02','副教授','計算機系'); INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (856,'張旭','男','1969-03-12','講師','電子工程系'); INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (825,'王萍','女','1972-05-05','助教','計算機系'); INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (831,'劉冰','女','1977-08-14','助教','電子工程系'); GO INSERT INTO [GRADE]([low],[up],[rank]) VALUES(90,100,'A'); INSERT INTO [GRADE]([low],[up],[rank]) VALUES(80,89,'B'); INSERT INTO [GRADE]([low],[up],[rank]) VALUES(70,79,'C'); INSERT INTO [GRADE]([low],[up],[rank]) VALUES(60,69,'D'); INSERT INTO [GRADE]([low],[up],[rank]) VALUES(0,59,'E');
1)、MySQL中:日期時間的加法運算:
一、查詢每一個學生的生日增長一週後的全部記錄 select *, DATE_ADD(Sbirthday ,INTERVAL 1 week ) as w1 from STUDENT 擴展: SELECT *, DATE_ADD(Sbirthday,INTERVAL 1 WEEK) as w1, #增長一週 DATE_ADD(Sbirthday,INTERVAL 2 MONTH) as m2, #增長2月 DATE_ADD(Sbirthday,INTERVAL 5 QUARTER) as q5 #增長5個季度 FROM STUDENT
2、計算出學生生日期後1年6個月的日期時間 select *,DATE_ADD( DATE_ADD(SBirthday,INTERVAL 1 YEAR) ,INTERVAL 6 MONTH) as NewTime from STUDENT
3、計算每一個學生出生一週、兩個月以及5個季度前的日期 SELECT *, DATE_ADD(Sbirthday,INTERVAL -1 WEEK) as w1, #一週前 DATE_ADD(Sbirthday,INTERVAL -2 MONTH) as m2, #兩個月前 DATE_ADD(Sbirthday,INTERVAL -5 QUARTER) as q5 #5個季度前 FROM STUDENT
2)、MSSQL Server 中:日期時間的加法運算:操作系統
1、查詢每一個學生的生日增長一週後的全部記錄 select *,DATEADD(WEEK,1,SBirthday) as oneweek from student 擴展 :計算每一個人出生後 3 年、20 個季度、68 個月以及 1000 個周前的日期
select SBirthday ,DATEADD(YEAR,3,SBirthday) as threeyears , DATEADD(QUARTER,20,SBirthday) as ttqutrs, DATEADD(MONTH ,68,SBirthday) as sxtmonths, DATEADD(WEEK,-1000,SBirthday) as thweek from student
2、計算出學生生日期後1年6個月的日期時間 select * ,DATEADD(MONTH,6,DATEADD(YEAR,1,SBirthday)) as oneyear from student
3、計算日期差額:.net
1)、MySQL中計算日期差額:code
1、計算王麗同窗的生日距離今天的天數 select *, DATEDIFF(NOW(),SBirthday) as day FROM STUDENT where SName = '王麗'
注意:DATEDIFF(date1,date2) 只能計算兩個日期之間的天數差額。若是要計算周差額,須要轉換htm
2、計算王麗同窗的生日距離今天的週數差額 select *, DATEDIFF(NOW(),SBirthday)/7 as week FROM STUDENT where SName = '王麗'
2)、MSSQLServer 中計算日期差額:
blog
1、計算王麗同窗的生日距離今天的天數 select * ,DATEDIFF(DAY,SBirthday,GETDATE()) from Student where SName= '王麗'
2、計算王麗同窗的生日距離今天的週數差額 select * ,DATEDIFF(WEEK,SBirthday,GETDATE()) from Student where SName = '王麗'
4、計算一個日期是星期幾
1)、MySQL中計算一個日期是星期幾
1、計算學生的生日分別是星期幾 select * , DAYNAME(SBirthday) as 星期 from STUDENT
2)、MSSQLServer 中計算日期的特定部分。
1、計算學生的生日分別是星期幾 select * ,DATENAME(WEEKDAY,SBirthday) as 星期 from Student
5、取得日期的指定部分
1)、MYSQL 中取得日期的指定部分
1、將學生的生日以 年-月-日的形式轉換 select SBirthDay,DATE_FORMAT(SBirthDay,'%Y年%m月%e日') AS rd FROM STUDENT
2、計算每一個學生的出生年份、出生時是當年的第幾天、出生時是當年的第幾周
select
SBirthday,
DATE_FORMAT(SBirthday,'%Y') AS y,
DATE_FORMAT(SBirthday,'%j') AS d,
DATE_FORMAT(SBirthday,'%U') AS u
from STUDENT
2)、MSSQLServer 中取得日期的指定部分
1、計算每一個學生的出生年份、出生時是當年的第幾天、出生時是當年的第幾周 select SBirthday, DATENAME(year,SBirthday) AS y, DATENAME(dayofyear,SBirthday) AS d, DATENAME(week,SBirthday) AS u from Student
3、計算學生出生日期是當年第幾天 select SBirthday, DATEPART(Dayofyear,SBirthday) from Student
注意:粗看起來,DATEPART()函數和DATENAME()函數徹底同樣,不過其實它們並非只是名稱不一樣的別名函數,雖然都是用來提取日期的特定部分的,
不過DATEPART()函數的返回 值是數字而DATENAME()函數則會將盡量的以名稱的方式作爲返回值。