SQL时间函数学习

笔记来自如鹏网杨中科老师所著的 《程序员的SQL金典》

一、日期时间函数: 

     日期时间类型分为 日期、时间、日期时间、时间戳
     日期:"年-月-日" 没有时间分秒 数据库中用 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 当前时间 小时:分钟:秒

二、日期增减

所需表及数据执行脚本:

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');
View Code
1)、MySQL中:日期时间的加法运算:
1、查询每个学生的生日增加一周后的所有记录
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

三、计算日期差额:

1)、MySQL中计算日期差额:

 

1、计算王丽同学的生日距离今天的天数
select *, DATEDIFF(NOW(),SBirthday) as day FROM STUDENT where SName = '王丽'

  注意:DATEDIFF(date1,date2)  只能计算两个日期之间的天数差额。如果要计算周差额,需要转换

 

2、计算王丽同学的生日距离今天的周数差额
select *, DATEDIFF(NOW(),SBirthday)/7 as week FROM STUDENT where SName = '王丽'

2)、MSSQLServer 中计算日期差额:

1、计算王丽同学的生日距离今天的天数
select * ,DATEDIFF(DAY,SBirthday,GETDATE()) from Student where SName= '王丽'
2、计算王丽同学的生日距离今天的周数差额
select * ,DATEDIFF(WEEK,SBirthday,GETDATE()) from Student where SName = '王丽'

四、计算一个日期是星期几

 1)、MySQL中计算一个日期是星期几 

1、计算学生的生日分别是星期几
select * , DAYNAME(SBirthday) as 星期 from STUDENT

 2)、MSSQLServer 中计算日期的特定部分。

1、计算学生的生日分别是星期几
select * ,DATENAME(WEEKDAY,SBirthday) as 星期 from Student 

五、取得日期的指定部分

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()函数则会将尽可能的以名称的方式做为返回值。

 

 

posted @ 2017-03-20 14:48  醒醒,天亮了  阅读(2215)  评论(0编辑  收藏  举报