SQL Server日期函数详解与实战
阅读目录
- 获取时间函数
- getdate()函数
- SYSDATETIME()函数
- 格式化函数
- CONVERT()函数
- FORMAT()函数
- 日期的拆分
- YEAR(date),MONTH(date),DAY(date)
- DATEPART() 函数
- DATENAME()函数,
- 日期计算函数
- EOMonth()函数
- dateadd()函数
- DATEDIFF()函数
- 构造日期的函数
- 练习实例
编写SQL中经常可以遇到日期的格式化与日期相关函数,这篇文章中我们将整理一下相关函数并给出一些实例供参考
获取时间函数
getdate()函数
getdate()函数获取当前的日期与时间。返回的为datetime类型
select GETDATE()
返回2020-09-21 10:07:38.170
SYSDATETIME()函数
SYSDATETIME()函数获取当前的日期与时间,但是返回的数据类型是DATETIME2,会更加精准,使用频率较少
SELECT SYSDATETIME()
格式化函数
CONVERT()函数
CONVERT() 函数是一个数据类型转化的通用函数,例如将数字类型转化为文本等。我们可以使用此函数把日期转换为新数据类型
语法为:
CONVERT(data_type(length),expression,style)
其中data_type(length) 规定目标数据类型(带有可选的长度)。expression指需要转换的值。style 规定日期/时间的输出格式。
其中常用的style代码及显示格式如下:
101: mm/dd/yyyy110: mm-dd-yyyy111: yyyy/mm/dd112: yyyymmdd120: yyyy-mm-dd hh:mm:ss121: yyyy-mm-dd hh:mm:sssssss
全部的style代码可以参考:https://www.cnblogs.com/rainman/p/6558261.html
例如;
SELECT CONVERT(varchar(100), GETDATE(), 111)
通过查看转化后的数据类型,可以看到新的数据类型已变成varchar(100)类型。
--查看数据类型
DECLARE @query nvarchar(max) = 'SELECT CONVERT(varchar(100), GETDATE(), 111) AS [Column1]';
EXEC sp_describe_first_result_set @query, null, 0;
FORMAT()函数
Format函数用于指定显示的格式。
语法:
FORMAT(value,format[,culture])
参数format用于指定显示的格式,给予用户对格式更自由地控制,culture参数是可选的,用于指定显示的语言,该函数返回值的数据类型是NVARCHAR,如果格式转换失败,该函数返回NULL
参数format使用#表示一个数值,参数 format 使用以下占位符来表示日期/时间的格式:
1. yyyy、MM、dd:表示年、月、日
2. hh:mm:ss fffffff:表示时、分、秒、毫秒
3. 使用“/”,“-”等作为连接各个部分(part)的分割符号
例如要将当前日期转化为20200921,则SQL语句为:
SELECT Format(GETDATE(), 'yyyyMMdd')
同时format()函数还可以转变数值类型,使用特定的格式展示等
select FORMAT(123456789,'###-##-####') AS 'Custom Number Result'
对应返回结果为123-45-6789
日期的拆分
YEAR(date),MONTH(date),DAY(date)
YEAR(date),MONTH(date),DAY(date)等函数返回给定date的年,月,日
实例:
select year('2020-9-21'),month('2020-9-21'),day('2020-9-21')
DATEPART() 函数
DATEPART() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等
语法:
DATEPART(datepart,date)
其中date 参数是合法的日期表达式。datepart为需要取出的数据缩写代码。常用的datepart参数可以是下列的值:
quarter:季度,取值范围是 1、2、3、4week:周在年中的序数,取值范围是 1 - 53dayofyear:天在年中的序数,取值范围是 1 - 366weekday:天在一周中的序数,取值范围是 1 - 7
全部参数可参阅:https://www.w3school.com.cn/sql/func_datepart.asp
具体实例代码:
--返回年,月份,季度,当前天数统计
SELECT DATEPART(yyyy,GETDATE()) AS Year,
DATEPART(m,GETDATE()) AS Month,
DATEPART(quarter,GETDATE()) AS Quarter,
DATEPART(dayofyear,GETDATE()) AS daynumber
DATENAME()函数,
与DATEPART不同的地方在于返回字符类型,比如Jan,一月等
语法:
DATENAME(datepart,date)
实例:
SELECT DATENAME(month, getdate()) AS 'Month'
对于中英文切换,使用如下语句:
set LANGUAGE 'Simplified Chinese'
select DATENAME(WEEKDAY,getutcdate())set LANGUAGE 'us_english'
select DATENAME(WEEKDAY,getutcdate())
日期计算函数
EOMonth()函数
EOMonth()函数可以返回月份的最后一天。因此我们可以利用这个函数求某个月的最后一天与第一天。
语法:
EOMONTH(start_date [,month_to_add])
其中start_date: 有两种输入方式,能够转换为Date的字符串类型 和 date 数据类型
month_to_add: 是int 类型,能够为正整数,负整数和0,默认值是0,如果省略,那么使用默认值0,表示月份的偏移量。
--查看当前月的最后一天、下一个月的最后一天、上一个月的最后一天
declare @date date
set @date=getdate()select EOMONTH(@date) as CurrentMonth_EndDay,EOMONTH(@date,1) as NextMonth_EndDay,EOMONTH(@date,-1) as LastMonth_EndDay
dateadd()函数
DATEADD() 函数在日期中添加或减去指定的时间间隔。
语法:
DATEADD(datepart,number,date)
其中datepart是單位(年,月,天等),number是指定的數值,date是原始日期
如下例的結果是当前时间的两个月后的日期,类型为datetime类型
SELECT DATEADD(MONTH,2,getdate())
根据上述两个函数我们还可以通过上个月的最后一天+1来获取每个月第一天
select dateadd(day,1,EOMONTH(getdate(),-1)) as CurrentMonth_startDay
同时也可以通过前面所说的日期拼接函数与format函数实现
declare @date date
set @date=getdate()select DATEFROMPARTS(year(@date),month(@date),1) --orselect FORMAT(GETDATE(),'yyyy-MM-01')
DATEDIFF()函数
DATEDIFF()函数计算两个日期之间的间隔,传回带正负符号的整数
语法:
DATEDIFF(datepart,startdate,enddate)
datepart为间隔的单位,可以选择天,周,月等。startdate跟enddate为起始时间
实例:
SELECT DATEDIFF(DAY, '2010-10-03','2010-10-04' )
结果返回1
构造日期的函数
构造日期的函数有以下几个:
语法:
DATEFROMPARTS ( year, month, day )DATETIME2FROMPARTS ( year, month, day, hour, minute, seconds, fractions, precision ) DATETIMEOFFSETFROMPARTS ( year, month, day, hour, minute, seconds, fractions, hour_offset, minute_offset, precision )TIMEFROMPARTS ( hour, minute, seconds, fractions, precision )
传入对应参数后即可
其中参数precision 是指小数秒的精度,指的是DateTime2(n)、DateTimeOffset(n),Time(n)中的n值,表示以多少位小数表示1s,一般比较少使用
select DATEFROMPARTS ( 2020, 1, 2 )
练习实例
现有一列日期,请根据日期输出对应的每周开始与每周结束日期并格式化。
例如原始数据time_test表:
| date |
|-----------|
| 2020-8-4 |
| 2020-8-5 |
| 2020-8-6 |
| 2020-8-12 |
| 2020-8-8 |
| 2020-8-12 |
| 2020-9-15 |
期望的输出结果:
| date | period |
|-----------|---------|
| 2020-8-4 |0803-0809|
| 2020-8-5 |0803-0809|
| 2020-8-6 |0803-0809|
| 2020-8-12 |0810-0816|
| 2020-8-8 |0803-0809|
| 2020-8-12 |0803-0809|
| 2020-9-15 |0810-0816|
其中period的开始为每周周一,结束日期为每周周日
解答:
先给出代码
select [date],
format(DATEADD(wk, DATEDIFF(wk,0,DATEADD(dd,-1,[date])), 0),'MMdd')+'-'+format(DATEADD(dd,-1,DATEADD(wk, DATEDIFF(wk,0,DATEADD(dd,6,[date])), 0)),'MMdd') as period
from time_test
从内到外解析这一段代码,我们首先利用datediif(wk,0,date)计算从1900-01-01 到指定日期的周数(0代表日期对应的数字形式,即1900-01-01)。之后利用DateAdd函数在1900-01-01 的基础上加上刚刚我们计算出的周数,从而得到每周的开始时间。最后通过forma函数对日期格式化即可得出结果。
其中在最内层有一个DATEADD(dd,-1,[date]),这个是由于我使用的是英文版的SQL server,所以每周是周日开始与周六结束,如果使用中文版SQL server,应该就可以直接使[date]列
个人公众号:Smilecoc的杂货铺,欢迎关注!
SQL Server日期函数详解与实战相关推荐
- mysql coalesce函数用法,SQL Server COALESCE函数详解及实例
SQL Server COALESCE函数详解 很多人知道ISNULL函数,但是很少人知道Coalesce函数,人们会无意中使用到Coalesce函数,并且发现它比ISNULL更加强大,其实到目前为止 ...
- SQL Server:触发器详解
SQL Server:触发器详解 1. 概述 2. 触发器的分类 3. Inserted和Deleted表 4. 触发器的执行过程 5. 创建触发器 6. 修改触发器: 7. 删除触发器: 8. 查看 ...
- SQL Server日期函数集合
SQL Server日期函数集合--1:获取系统日期和时间值函数 --getdate() SELECT GETDATE() AS 'today' --getutcdate() SELECT GETUT ...
- MS SQL Server 数据库连接字符串详解
MS SQL Server 数据库连接字符串详解 问题 : 超时时间已到.在从池中获取连接之前超时时间已过.出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小. 解决办法 1. 在代码里面 ...
- pandas pivot_table透视表、crosstab交叉表、aggfunc函数详解及实战
pandas pivot_table透视表.crosstab交叉表详解及实战 pivot_table透视表.crosstab交叉表的本质是一样的,都是通过对表格的透视或者重新排布.人为设置信息的行和列 ...
- c2064 项不会计算为接受0个参数的函数_【JS必知必会】高阶函数详解与实战
本文涵盖 前言 高级函数概念 函数作为参数的高阶函数 map filter reduce sort详解与实战 函数作为返回值的高阶函数 isType函数与add求和函数 如何自己创建高阶函数 前言 一 ...
- Sql server 日期函数和日期转换
时间函数 SQL Server Date 函数 下面的表格列出了 SQL Server 中最重要的内建日期函数: 函数 描述 GETDATE() 返回当前日期和时间 DATEPART(Type,dat ...
- Sql Server之数据类型详解
数据类型是一种属性,用于指定对象可保存的数据的类型,SQL Server中支持多种数据类型,包括字符类型.数值类型以及日期类型等.数据类型相当于一个容器,容器的大小决定了装的东西的多少,将数据分为 ...
- sql server 存储过程的详解
SqlServer存储过程详解 1.创建存储过程的基本语法模板: if (exists (select * from sys.objects where name = 'pro_name'))drop ...
最新文章
- 如何写windbg高级脚本---以访问文件的windbg脚本为例说明
- 鼠标事件在浏览器的差异
- c语言中switch语句流程图_C语言:C语言保留字(关键字)
- ASP.NET-get与post模式的区别
- 针对媒体不实报道误导大众--抹黑C#工资垫底
- 蓝桥杯第八届省赛JAVA真题----承压计算
- 用Python实现跳一跳自动跳跃。
- java全文检索功能_基于Java的全文检索引擎简介
- Qt4_使用项视图的简便类
- centos7 默认启动项_如何在centos7中搭建 ISCSI 服务
- 黑苹果安装教程,配EFI引导文件+软件!
- win10 uwp 访问解决方案文件
- WTP 线程池管理系统,修改配置后能够实时刷新
- 键盘上的按键--键码 对应表
- 高通快速调试命令集合---持续更新
- 火狐浏览器首页被搜狗劫持
- Hibernate2:构建单例模式的SessionFactory
- 学区摇号软件设计_摇号后时代,学区房不是你想买就能买!这篇教你避免采坑!...
- Kali的ZMap安装经验总结
- 计算机网络:网络层的功能概述