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');
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()函数则会将尽可能的以名称的方式做为返回值。
SQL时间函数学习的更多相关文章
- Sql时间函数
一.sql server日期时间函数 Sql Server中的日期与时间函数 1. 当前系统日期.时间 select getdate() 2. dateadd 在向指定日期加上一段时间 ...
- sql 时间函数大全
1. 当前系统日期.时间 select getdate() 2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值 例如:向日期加上2天 se ...
- SQL 时间函数 Datepart()与DateName()
1.Datepart() 返回代表指定日期的指定日期部分的整数 语法 Datepart(datepart,date) 返回类型 int datepart: 日期部分 缩写 year yy, yyyy ...
- sql server 函数学习
sql server 创建函数 资料 https://docs.microsoft.com/zh-cn/sql/relational-databases/user-defined-functions/ ...
- 几个常用的SQL 时间函数
--当月第一天declare @startFirstDate datetimeset @startFirstDate=dateadd(dd,datediff(dd,0,getdate()),-day( ...
- sql 时间函数用法
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- Oracle常用SQL时间函数
1.查询当前日期和时间 select sysdate from dual; 2.查询本月最后一天 select last_day(sysdate) from dual; 3.查询前后多少月 ) fro ...
- python时间函数学习
格式化当前日期: import time print time.strftime('%Y-%m-%d') 获取一天前的日期: import datetime import time onedayago ...
- SQL学习_时间函数
最近测试报表需要统计不同时间段的列表记录,收集一些时间函数作为参考,原文地址:http://blog.csdn.net/lyzlyfok/article/details/6282509 sql ser ...
- SQL SERVER时间函数
本篇文章还是学习<程序员的SQL金典>内容的记录,此次将讲解的是SQL SERVER的时间函数. 本文只讲SQL SERVER支持的时间函数(其它数据库这里就不罗列了,想看更多的可以关注& ...
随机推荐
- Idea未识别maven项目
https://blog.csdn.net/qq_41460654/article/details/120539509
- Git03 自建代码托管平台-GitLab
1 GitLab 简介 GitLab 是由 GitLabInc.开发,使用 MIT 许可证的基于网络的 Git 仓库管理工具,且具有wiki 和 issue 跟踪功能.使用 Git 作为代码管理工具, ...
- Maven依赖冲突解决总结
转载请注明出处: 1.Jar包冲突的通常表现 Jar包冲突往往是很诡异的事情,也很难排查,但也会有一些共性的表现. 抛出java.lang.ClassNotFoundException:典型异常,主要 ...
- Canvas:绘制矩形
函数 CanvasPath.rect(x, y, w, h) 参数名 类型 描述 x Number 矩形起始位置 y Number 矩形起始位置 w Number 矩形宽度 h Number 矩形高度 ...
- 基于Ubuntu搭建OpenGL开发环境
1. 引言 笔者这里基于Ubuntu 20.04.3 LTS系统,搭建OpenGL开发环境,主要使用的库有GLFW和GLAD GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最 ...
- 【转】IDEA搭建SSM框架(spring+maven+mybatis+mysql+junit)
环境安装: apache-tomcat-9.0 https://tomcat.apache.org/download-90.cgi 配置:https://blog.csdn.net/qq_415706 ...
- Electron 应用图标修改
1,首先给窗口添加图标: 1) 窗口图标是图片jpg或者png格式,如果没有图标去[https://www.aigei.com/icon/?wd=icon%E7%BD%91&bd_vid=10 ...
- No.2.1
字体图标( 目的:使用字体图标技巧实现网页中简洁的图标效果) 字体图标展示的是图标,本质是字体,处理简单的.颜色单一的图片 优点:灵活性:灵活的修改样式,例如:尺寸,颜色等 轻量级:体积小,渲染快,降 ...
- FreeRTOS内存管理文档
heap1.c:只能申请内存,不能释放内存.适合运行后不申请新内存的程序. heap2.c: 既能申请内存,也能释放内存,但释放内存后,相邻的空余内存不能合并.适合每次申请相同大小内存的变量的程序使用 ...
- 2020icpc沈阳H
优化转移DP Problem - H - Codeforces 题意 Aloha 要骑单车,可以单独花费 \(r\) 元骑 1 次,也可以购买某一种单车卡,第 \(i\) 种单车卡 \(c_i\) 元 ...