目录
(一)前言
(二)Convert函数知识
1. 定义和用法
2. 语法
3. 可以使用的 style 值
4. 实例
(三)时间函数
1. 前提
2. 常用时间函数
(1)格式
(2)实例
(四)一些特殊例子
1. 当天的0点0分0秒,当天的23点59分59秒
(1)第一种写法
(2)第二种写法
2. 当前时间所在的周一0点0分0秒 当前时间所在的周日23点59分59秒
3. 当前时间所在的月初0点0分0秒 当前时间所在的月末23点59分59秒
4. 当前时间所在的年初0点0分0秒 当前时间所在的年尾23点59分59秒
5. 取上一个小时的初始整点
(一)前言
在SQL的过滤条件中合理地使用时间格式,这在我们日常工作是很常见的。所以本文我整理了以SQL SERVER为使用版本的一些经典的时间取法的书写方式。
(二)Convert函数知识
1. 定义和用法
CONVERT() 函数是把日期转换为新数据类型的通用函数。
CONVERT() 函数可以用不同的格式显示日期/时间数据。
2. 语法
CONVERT(data_type(length),data_to_be_converted,style)
data_type(length) 规定目标数据类型(带有可选的长度)。data_to_be_converted 含有需要转换的值。style 规定日期/时间的输出格式。
3. 可以使用的 style 值
Style ID | Style 格式 |
100 或者 0 | mon dd yyyy hh:miAM (或者 PM) |
101 | mm/dd/yy |
102 | yy.mm.dd |
103 | dd/mm/yy |
104 | dd.mm.yy |
105 | dd-mm-yy |
106 | dd mon yy |
107 | Mon dd, yy |
108 | hh:mm:ss |
109 或者 9 | mon dd yyyy hh:mi:ss:mmmAM(或者 PM) |
110 | mm-dd-yy |
111 | yy/mm/dd |
112 | yymmdd |
113 或者 13 | dd mon yyyy hh:mm:ss:mmm(24h) |
114 | hh:mi:ss:mmm(24h) |
120 或者 20 | yyyy-mm-dd hh:mi:ss(24h) |
121 或者 21 | yyyy-mm-dd hh:mi:ss.mmm(24h) |
126 | yyyy-mm-ddThh:mm:ss.mmm(没有空格) |
130 | dd mon yyyy hh:mi:ss:mmmAM |
131 | dd/mm/yy hh:mi:ss:mmmAM |
4. 实例
select CONVERT(varchar, getdate(), 120 ) --返回 2022-10-30 00:04:28
select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','') --返回 20221030000446
select CONVERT(varchar(12) , getdate(), 111 ) --返回 2022/10/30
select CONVERT(varchar(12) , getdate(), 112 ) --返回 20221030
select CONVERT(varchar(12) , getdate(), 102 ) --返回 2022.10.30
select CONVERT(varchar(12) , getdate(), 101 ) --返回 10/30/2022
select CONVERT(varchar(12) , getdate(), 103 ) --返回 30/10/2022
select CONVERT(varchar(12) , getdate(), 104 ) --返回 30.10.2022
select CONVERT(varchar(12) , getdate(), 105 ) --返回 30-10-2022
select CONVERT(varchar(12) , getdate(), 106 ) --返回 30 10 2022
select CONVERT(varchar(12) , getdate(), 107 ) --返回 10 30, 2022
select CONVERT(varchar(12) , getdate(), 108 ) --返回 00:07:14
select CONVERT(varchar(12) , getdate(), 109 ) --返回 10 30 2022 1
select CONVERT(varchar(12) , getdate(), 110 ) --返回 10-30-2022
select CONVERT(varchar(12) , getdate(), 113 ) --返回 30 10 2022 0
select CONVERT(varchar(12) , getdate(), 114 ) --返回 00:09:00:440
(三)时间函数
1. 前提
我们将使用 GETDATE() 函数来获得当前的日期/时间
select getdate();
2. 常用时间函数
(1)格式
函数 | 参数/功能 |
GetDate( ) | 返回系统目前的日期与时间 |
DateDiff (interval,date1,date2) | 以interval 指定的方式,返回date2 与date1两个日期之间的差值 date2-date1 |
DateAdd (interval,number,date) | 以interval指定的方式,加上number之后的日期 |
DatePart (interval,date) | 返回日期date中,interval指定部分所对应的整数值 |
DateName (interval,date) | 返回日期date中,interval指定部分所对应的字符串名称 |
值 | 缩 写(Sql Server) | Access 和 ASP | 说明 |
Year | Yy | yyyy | 年 1753 ~ 9999 |
Quarter | Qq | q | 季 1 ~ 4 |
Month | Mm | m | 月1 ~ 12 |
Day of year | Dy | y | 一年的日数,一年中的第几日 1-366 |
Day | Dd | d | 日,1-31 |
Weekday | Dw | w | 一周的日数,一周中的第几日 1-7 |
Week | Wk | ww | 周,一年中的第几周 0 ~ 51 |
Hour | Hh | h | 时0 ~ 23 |
Minute | Mi | n | 分钟0 ~ 59 |
Second | Ss | s | 秒 0 ~ 59 |
Millisecond | Ms | - | 毫秒 0 ~ 999 |
(2)实例
--dateadd 原有时间加: 2022-02-17 13:20:16 此时间加12个月
select dateadd(MONTH,12,'2022-02-17 13:20:16') --返回:2023-02-17 13:20:16.000 (参数month可以改为 day,year等日期加相应的值)
--datediff 两个时间的差 (后面-前面=返回值)
select datediff(day,'2022-02-01','2022-02-18') --返回:17 (参数day可以改为 month,year等日期加相应的值)
--datepart 获取日期的某个部分整数
select DATEPART(month, '2022-2-17') --返回 2 (参数month可以改为 day,year等日期加相应的值)
--datename 获取指定部位的字符串
select datename(weekday, '2022-2-17') --返回 星期日 (参数weekday可以改为 day,year等日期加相应的值)
--day(), month(),year() 获取指定部位的字符串
select day('2022-2-15') --返回15
(四)一些特殊例子
1. 当天的0点0分0秒,当天的23点59分59秒
(1)第一种写法
select convert(
datetime
,convert(varchar(10),getdate(),120)) as a,DATEADD(SS,-1,DATEADD(DD,1,CONVERT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120)))) as b
(2)第二种写法
SELECT cast(convert(char(10),getdate(),120)+' 00:00:00' as
datetime)--取0点
SELECT cast(convert(char(10),getdate(),120)+' 23:59:59' as datetime)--取24点
2. 当前时间所在的周一0点0分0秒 当前时间所在的周日23点59分59秒
select DATEADD(wk,DATEDIFF(wk,0,getdate()),0) as a ,DATEADD(day,6,DATEADD(wk,DATEDIFF(wk,0,getdate()),0)) as b,DATEADD(SS,-1,DATEADD(DD,1,CONVERT(DATETIME,CONVERT(VARCHAR(10),DATEADD(day,6,DATEADD(wk,DATEDIFF(wk,0,getdate()),0)),120)))) as c
3. 当前时间所在的月初0点0分0秒 当前时间所在的月末23点59分59秒
select dateadd(month, datediff(month, 0, getdate()), 0) as a ,dateadd(month, datediff(month, 0, dateadd(month, 1, getdate())), -1) as b,DATEADD(SS,-1,DATEADD(DD,1,CONVERT(DATETIME,CONVERT(VARCHAR(10),dateadd(month, datediff(month, 0, dateadd(month, 1, getdate())), -1),120)))) as c
4. 当前时间所在的年初0点0分0秒 当前时间所在的年尾23点59分59秒
select dateadd(year,datediff(year,0,getdate()),0) as a ,dateadd(year,datediff(year,-1,getdate()),-1) as b,DATEADD(SS,-1,DATEADD(DD,1,CONVERT(DATETIME,CONVERT(VARCHAR(10),dateadd(year,datediff(year,-1,getdate()),-1),120)))) as c
5. 取上一个小时的初始整点
即假如现在是下午18:30,那我们要取的是 17:00。
select convert(datetime,convert(VARCHAR(13),DATEADD(hour,-1,GETDATE()),120) + ':00:00.000') as a;