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支持的时间函数(其它数据库这里就不罗列了,想看更多的可以关注& ...
随机推荐
- RxJava 异常时堆栈显示不正确?解决方法都在这里
本文首发我的博客,github 地址 大家好,我是徐公,今天为大家带来的是 RxJava 的一个血案,一行代码 return null 引发的. 前阵子,组内的同事反馈说 RxJava 在 debug ...
- 获取微信小程序列表渲染 index
微信小程序列表渲染 index(索引值)通过 wx:for-index="index" 来获取: <view class="item" wx:for=&q ...
- CSS 子代选择器(>)
后代选择器 后代选择器?是一种多个用空格分隔的选择器,别称包含选择器.范围是当前节点的所有子节点,包括其直接子节点. div#app下的所有 div 元素都使用下面的样式: div#app div { ...
- (原创)【B4A】一步一步入门05:控件、公有属性、水平锚定、垂直锚定(控件篇01)
一.前言 前面的教程,已经完整讲述了用B4A开发安卓APP从新建项目到编译发布的完整流程.从本篇开始,我们将会从B4A的细节处着手,一步一步掌握B4A. 从本篇开始的子系列为"控件篇&quo ...
- net core api上传下载大文件 413、400错误 IIS服务器
1.背景 上传文件时,如果文件太大(一般指超过30M的文件)会报错,报错原因如下 IIS服务器:限制大文件上传,报413错误码 net core api项目:限制大文件上传,报400错误码 2.首先 ...
- python中的字符串的常用方法介绍
a = "alxe Li 金角大王" #创建一个字符串来演示方法的功能结果.一下都使用这个字符串演示. 首先要了解的常识性的知识点是:字符串是不可变的序列.所有对字符串的内 ...
- ubuntu20.04虚拟机无法自动获取IP地址
具体操作 # ens33 为网卡名称 sudo dhclient ens33
- Git提交代码报错husky > pre-commit,
拉取了新项目以后,git突然不能用了 报husky > pre-commit, 解决办法:进入你的项目显示隐藏git文件 进入git文件 找到 hooks / pre-commit ...
- adb server version (36) doesn‘t match this client (41)解决
问题描述:夜神模拟器,dos窗口下,然后adb devices发现连不上模拟器了,报adb server version (36) doesn't match this client (41); ki ...
- [Unity]自定义地图编辑器(Scene视图下,EditorWindow的简单应用)
最近的游戏又很多关卡需要配置(XML保存),给策划写了个非常简单的编辑器,记录下+废话下 1:Editor下打开新窗口需要继承EditorWindow,然后使用获取窗口即可,注意放在Editor文件夹 ...