前言
在SQL Server中,时间和日期是常见的数据类型,也是数据处理中重要的一部分。SQL Server提供了许多内置函数,用于处理时间和日期数据类型。这些函数可以帮助我们执行各种常见的任务,例如从日期中提取特定的部分,计算日期之间的差异,以及将日期和时间转换为不同的格式。本文将介绍SQL Server中一些常用的时间和日期函数,以及它们的用法和示例。
一些常用的函数
GetDate获取当天日期
select getdate()
DateFromParts自定义一个日期
select datefromparts(2023,2,28)
DateFormat转换日期格式
SELECT DATEFORMAT(YourDateColumn, 'YYYY-MM-DD') AS FormattedDate FROM YourTable
DateAdd函数计算日期偏移后的新日期
SQL中的DATEADD函数用于在给定的日期上添加指定的时间间隔。它的语法如下:
DATEADD(datepart, number, date)
其中,datepart参数指定要添加的时间间隔类型,例如year(年)、quarter(季度)、month(月)、day(天)、hour(小时)、minute(分钟)或second(秒)。number参数指定要添加的时间间隔数量。date参数是要进行添加操作的日期。
下面是一些DateDADD函数使用的示例:
--1. 在当前日期上添加一天:SELECT DATEADD(day, 1, GETDATE())--2. 在当前日期上添加一个月:SELECT DATEADD(month, 1, GETDATE())--3. 在当前日期上添加一小时:SELECT DATEADD(hour, 1, GETDATE())--4. 在指定的日期上添加一周:SELECT DATEADD(week, 1, '2021-01-01')
这些示例中,DATEADD函数会返回一个新的日期,该日期是在给定的日期上添加了指定的时间间隔后得到的。
DateDiff函数算时间差
在SQL中,DATEDIFF函数用于计算两个日期之间的时间间隔。它返回两个日期之间的差值,以指定的时间间隔单位为单位。
DATEDIFF函数的语法如下:
DATEDIFF(datepart, startdate, enddate)
其中,datepart参数指定要计算的时间间隔类型,例如year(年)、quarter(季度)、month(月)、day(天)、hour(小时)、minute(分钟)或second(秒)。startdate和enddate参数是要计算时间间隔的两个日期。
下面是一些示例:
- 计算两个日期之间的天数差:
SELECT DATEDIFF(day, '2021-01-01', '2021-02-01')
- 计算两个日期之间的小时差:
SELECT DATEDIFF(hour, '2021-01-01 10:00:00', '2021-01-01 12:00:00')
- 计算两个日期之间的月数差:
SELECT DATEDIFF(month, '2021-01-01', '2022-01-01')
这些示例中,DATEDIFF函数会返回两个日期之间的差值,以指定的时间间隔单位为单位。
取日期的周、年、月、日等信息
DATEPART函数。DATEPART函数返回一个整数,它是日期的一部分,例如日,月和年。
以下是DATEPART函数的语法:
select DATEPART ( date_part , input_date )
DATEPART函数有两个参数:
date_part是要提取的日期的一部分(参见下表中的有效日期部分)。
input_date是提取日期部分的日期。
因此,获取一个日期的WeekNum和WeekDay可以这样
select DATEPART ( wk , getdate() ) as wk
select DATEPART ( weekday , getdate() ) as wkd
date_part可取值:
在最前面加上以下语句将每周第一天设置为周一:
SET DATEFIRST 1
--
select DATEPART ( wk , getdate() ) as wk--
select DATEPART ( weekday , getdate() ) as wkd
获取日期所属的当年的ISO标准周周序(ISO 标准周是一种将一年分为 52 或 53 周的时间计算方法,它是国际标准化组织(ISO)制定的一种时间标准。ISO 标准周的起始日期为每年的第一个周四,即该周的第一天为周四,最后一天为周三)
select DATEPART ( isowk , getdate() ) as iso_wk
计算本月第一天,上月第一天,去年本月第一天日期
sql中没有现成的函数实现,我们可以分别计算当前日期的天数d,然后往前移动d天,就可以算出来当前月的第一天的日期了。还一种思路,日期实际上就是数值,我们以0作为基础日期,0表示的日期1970年1月1日1时1分1秒,我们计算当前日期距离基础日期0过去了多少个月,然后在基础日期上移动相应的月份即可。
有了当前日期月份的第一天,移动一个月就得到了上个月的第一天日期,移动一年就得到了去年当月第一天的日期。
-- 本月第一天,0作为基础日期1970-01-01 00:00:00
SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) AS '本月第一天';-- 上个月第一天
SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0) AS '上个月第一天';-- 上个月最后一天
SELECT DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)) AS '上个月最后一天';
计算本周第一天,上周第一天以及上周同期
涉及到周的计算要复杂点,如何计算当前周的第一天,如何计算当前周的前一周的第一天。
对于第一个问题,我们思考先计算当前日期是周几,比方说周三,那说明周一需要往前推2天,我们先用dateparts计算WeekDay,然后用dateadd往前推就好了。
有了本周第一天,再推一个week就出来上周第一天的日期,接着加上这周的周几就能推出上周同期的日期。
DECLARE @Today DATE = GETDATE();
--设置周一为一周的第一天
SET DATEFIRST 1
-- 计算本周第一天
DECLARE @FirstDayOfWeek DATE = DATEADD(DAY, 1 - DATEPART(WEEKDAY, @Today), @Today);-- 计算上周第一天
DECLARE @FirstDayOfLastWeek DATE = DATEADD(WEEK, -1, @FirstDayOfWeek);-- 输出结果
SELECT @FirstDayOfWeek AS '本周第一天', @FirstDayOfLastWeek AS '上周第一天';