sql server 日期计算汇总(含各种日期计算方法)
- 格式:doc
- 大小:37.00 KB
- 文档页数:6
SQL Server各种日期计算方法通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。
你们大部分人大概都知道怎样把日期进行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几个函数中计算出自己所需要的日期!在这篇文章里,我将告诉你如何使用DATEADD和DATEDIFF函数来计算出在你的程序中可能你要用到的一些不同日期。
在使用本文中的例子之前,你必须注意以下的问题。
大部分可能不是所有例子在不同的机器上执行的结果可能不一样,这完全由哪一天是一个星期的第一天这个设置决定。
第一天(DATEFIRST)设定决定了你的系统使用哪一天作为一周的第一天。
所有以下的例子都是以星期天作为一周的第一天来建立,也就是第一天设置为7。
假如你的第一天设置不一样,你可能需要调整这些例子,使它和不同的第一天设置相符合。
你可以通过@@DATEFIRST函数来检查第一天设置。
为了理解这些例子,我们先复习一下DATEDIFF和DATEADD函数。
DATEDIFF函数计算两个日期之间的小时、天、周、月、年等时间间隔总数。
DATEADD函数计算一个日期通过给时间间隔加减来获得一个新的日期。
要了解更多的DATEDI FF和DATEADD函数以及时间间隔可以阅读微软联机帮助。
使用DATEDIFF和DATEADD函数来计算日期,和本来从当前日期转换到你需要的日期的考虑方法有点不同。
你必须从时间间隔这个方面来考虑。
比如,从当前日期到你要得到的日期之间有多少时间间隔,或者,从今天到某一天(比如1900-1-1)之间有多少时间间隔,等等。
理解怎样着眼于时间间隔有助于你轻松的理解我的不同的日期计算例子。
一个月的第一天第一个例子,我将告诉你如何从当前日期去这个月的最后一天。
请注意:这个例子以及这篇文章中的其他例子都将只使用DATEDIFF和DATEADD函数来计算我们想要的日期。
每一个例子都将通过计算但前的时间间隔,然后进行加减来得到想要计算的日期。
在 SQL 中,日期运算是非常常见的操作,我们可以使用各种内置函数来对日期值进行处理。
下面列举几个常用的日期运算:1. 加减天数我们可以使用 DATEADD 函数在日期上加上或减去一定的天数,语法为:DATEADD(datepart, number, date),其中 datepart 表示要添加或减去的时间单位,如day、month、year 等,number 表示要添加或减去的数量,date 表示要进行运算的日期。
例如,下面的语句表示将今天的日期加上 7 天:```SELECT DATEADD(day, 7, GETDATE())```2. 计算两个日期之间的差值我们可以使用 DATEDIFF 函数来计算两个日期之间的差值,语法为:DATEDIFF(datepart, startdate, enddate),其中 datepart 表示要计算的时间单位,如 day、month、year 等,startdate 和 enddate 分别表示要进行计算的两个日期。
例如,下面的语句计算从今天到圣诞节还有多少天:```SELECT DATEDIFF(day, GETDATE(), '2023-12-25')```3. 提取日期部分我们可以使用 DATEPART 函数来提取日期值中的某个部分,如年、月、日等,语法为:DATEPART(datepart, date),其中 datepart 表示要提取的日期部分,date 表示要进行提取的日期。
例如,下面的语句表示提取今天的月份:```SELECT DATEPART(month, GETDATE())```4. 转换日期格式我们可以使用 CONVERT 函数来将日期值转换成指定的格式,语法为:CONVERT(datatype, expression, style),其中 datatype 表示要转换成的数据类型,expression 表示要进行转换的表达式,style 表示要转换成的格式。
SQL--Server常用公式与函数整理一、算术运算符SQL*Server*支持基本的算术运算符,如加(+)、减(-)、乘()、除(/)和取余(%)等。
这些运算符可以直接在*SQL*查询中使用,用于数字和日期类型的数据计算。
示例:sqlSELECT*5+3AS加法结果;--输出结果为8SELECT*10-5AS减法结果;--输出结果为5SELECT*32AS乘法结果;--输出结果为6SELECT*10/2AS除法结果;--输出结果为5SELECT*11%2AS取余结果;--输出结果为1二、字符串函数字符串函数主要用于字符串的处理和操作,包括截取、连接、查找、替换、转换等。
常用的字符串函数有:*LEN(string_expression):返回字符串的长度。
*LEFT(string_expression,*number_of_chars):返回字符串最左侧的指定数量的字符。
*RIGHT(string_expression,*number_of_chars):返回字符串最右侧的指定数量的字符。
*SUBSTRING(string_expression,*start,*length):返回字符串的子字符串。
*CHARINDEX(substring,*expression*[,*start_location]):返回子字符串在表达式中的起始位置。
REPLACE(string_expression,*search_string,*replacement_string):在字符串中替换指定的子字符串。
*LOWER(string_expression):将字符串转换为小写。
*UPPER(string_expression):将字符串转换为大写。
示例:sqlSELECT*LEN('Hello*World')*AS*字符串长度;*--*输出结果为*11SELECT*LEFT('Hello*World',*5)*AS*左侧子串;*--*输出结果为*Hello三、日期函数日期函数用于日期和时间的处理和计算,常用的日期函数有:*GETDATE():返回当前日期和时间。
sqlserver sql 间隔在SQL Server中,间隔通常用于计算日期和时间之间的差异,或者对数据进行分组和聚合。
以下是关于SQL Server中间隔的一些常见用法和示例:1. 计算日期间的间隔:若要计算两个日期之间的天数间隔,可以使用DATEDIFF函数,例如:SELECT DATEDIFF(day, '2022-01-01', '2022-01-31') AS DayDiff;这将返回31天,表示从2022年1月1日到2022年1月31日的间隔为31天。
2. 计算时间间的间隔:若要计算两个时间之间的小时间隔,可以使用DATEDIFF函数,例如:SELECT DATEDIFF(hour, '12:00:00', '15:00:00') AS HourDiff;这将返回3小时,表示从12:00:00到15:00:00的间隔为3小时。
3. 计算日期时间间的间隔:若要计算两个日期时间之间的间隔,可以使用DATEDIFF函数,例如:SELECT DATEDIFF(minute, '2022-01-01 12:00:00','2022-01-01 12:30:00') AS MinuteDiff;这将返回30分钟,表示从2022年1月1日12:00:00到2022年1月1日12:30:00的间隔为30分钟。
4. 使用间隔进行数据分组和聚合:间隔还可以用于对数据进行分组和聚合。
例如,可以使用DATEPART函数和DATEADD函数来按照一定的间隔对日期进行分组,并对每个间隔内的数据进行聚合操作。
总之,在SQL Server中,间隔可以用于计算日期和时间之间的差异,进行数据分组和聚合等操作。
以上是一些常见的使用方式和示例,希望对你有所帮助。
sql时间统计语句和实例标题:SQL时间统计语句和实例1. 统计某个表中每个日期的数据量```sqlSELECT DATE(date_column) AS date, COUNT(*) AS countFROM tableGROUP BY DATE(date_column)ORDER BY DATE(date_column);```这条语句可以统计某个表中每个日期的数据量,并按日期进行排序,以便更好地观察数据的分布情况。
2. 统计某个时间段内每天的数据量```sqlSELECT DATE(date_column) AS date, COUNT(*) AS countFROM tableWHERE date_column BETWEEN '2022-01-01' AND '2022-01-31' GROUP BY DATE(date_column)ORDER BY DATE(date_column);```这条语句可以统计某个时间段内每天的数据量,并按日期进行排序,以便更好地了解数据的变化趋势。
3. 统计某个时间段内每小时的数据量```sqlSELECT DATE_FORMAT(date_column, '%Y-%m-%d %H:00:00') AS hour, COUNT(*) AS countFROM tableWHERE date_column BETWEEN '2022-01-01' AND '2022-01-31' GROUP BY hourORDER BY hour;```这条语句可以统计某个时间段内每小时的数据量,并按小时进行排序,以便更好地观察数据的小时变化情况。
4. 统计某个时间段内每周的数据量```sqlSELECT YEARWEEK(date_column) AS week, COUNT(*) AS count FROM tableWHERE date_column BETWEEN '2022-01-01' AND '2022-12-31' GROUP BY weekORDER BY week;```这条语句可以统计某个时间段内每周的数据量,并按周进行排序,以便更好地了解数据的周变化趋势。
在SQL Server在线图书或者在线帮助系统中,函数的可选参数用方括号表示。
在下列的CONVERT()函数例子中,数据类型的length和style参数是可选的: CONVERT (data-type [(length)], expression[,style])可将它简化为如下形式,因为现在不讨论如何使用数据类型:CONVERT(date_type, expression[,style])根据上面的定义,CONVERT()函数可接受2个或3个参数。
因此,下列两个例子都是正确的:SELECT CONVERT(Varchar(20),GETDATE())SELECT CONVERT(Varchar(20),GETDATE(), 101)这个函数的第一个参数是数据类型Varchar(20),第2个参数是另一个函数GETDATE()。
GETDATE()函数用datetime数据类型将返回当前的系统日期和时间。
第2条语句中的第3个参数决定了日期的样式。
这个例子中的101指以mm/dd/yyyy格式返回日期。
本章后面将详细介绍GETDATE()函数。
即使函数不带参数或者不需要参数,调用这个函数时也需要写上一对括号,例如GETDATE()函数。
注意在书中使用函数名引用函数时,一定要包含括号,因为这是一种标准形式。
确定性函数由于数据库引擎的内部工作机制,SQL Server必须根据所谓的确定性,将函数分成两个不同的组。
这不是一种新时代的信仰,只和能否根据其输入参数或执行对函数输出结果进行预测有关。
如果函数的输出只与输入参数的值相关,而与其他外部因素无关,这个函数就是确定性函数。
如果函数的输出基于环境条件,或者产生随机或者依赖结果的算法,这个函数就是非确定性的。
例如,GETDATE()函数是非确定性函数,因为它不会两次返回相同的值。
为什么要把看起来简单的事弄得如此复杂呢?主要原因是非确定性函数与全局变量不能在一些数据库编程对象中使用(如用户自定义函数)。
SQL中的⽇期计算这两天写⼀个和统计数据有关的存储过程,⾥⾯要利⽤⽇期进⾏⼀些计算和判断,也⾃然要利⽤SQL的⼀些⽇期相关的函数。
这⾥略记⼀下,当是复习⼀下SQL。
利⽤SQL脚本内置的⼏个函数,我们能灵活的对⽇期进⾏计算和⽐较。
常⽤的⼏个函数:GETDATE(),DATEDIFF(),DATEADD()GETDATE() 当然顾名思义,得到当前的⽇期,返回类型是DateTime类型。
DATEDIFF ( datepart , startdate , enddate ) ⽤于判断在两个⽇期之间存在的指定时间间隔的数⽬。
第⼀个参数是指定时间间隔的类型,例如mm(⽉),dd(天),yy(年),ms(毫秒),ss(秒),不同的间隔类型,返回的结果也不⼀样。
DATEADD (datepart , number, date ) ⽤于⽇期运算的函数,将传⼊的⽇期,加上指定时间间隔数⽬的⽇期。
例如,计算得到本年的第⼀天:Select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)我们来分析下这个SQL语句就可以知道,⾸先从最⾥⾯的getdate()开始,getdate()得到当前⽇期和时间,外层的datediff,计算当前⽇期和1900-01-01 00:00:00之间的时间间隔,返回单位是以年来统计的,如果我们分开看DATEDIFF(yy,0,getdate()),0)的结果,返回就是:109。
返回的109,传递给最外层的DATEADD函数,将1900-01-01 00:00:00加上109年,得到的结果,⾃然就是2009-01-01 00:00:00了,也即本年的第⼀天。
同样,灵活的利⽤这⼏个函数的组合,我们可以得到不同的结果:得到当⽉的第⼀天:Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)得到当前季度的第⼀天:Select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)得到当天的起始时间: Select DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)得到上个⽉最后⼀天: Select DATEADD(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))得到上个⽉的第⼀天: Select DATEADD(m,-1,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))其原理就是得到当⽉第⼀天,再减去三毫秒(SQL的时间以3毫秒为⼀个单位),这样以当前为2⽉,得到的结果就是:2009-01-3123:59:59.997得到去年的最后⼀天: Select DATEADD(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))得到本⽉的最后⼀天: Select DATEADD(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))得到本年的最后⼀天: Select DATEADD(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))得到本⽉的第⼀个星期⼀: Select DATEADD(wk, DATEDIFF(wk,0,DATEADD(dd,6-datepart(day,getdate()),getdate())), 0)。
DECLARE @Date DATETIME SET @Date = GETDATE () -- 前一天,给定日期的前一天 SELECT DATEADD ( DAY , - 1 , @Date ) AS 前一天 -- 后一天,给定日期的后一天 SELECT DATEADD ( DAY , 1 , @Date ) AS 后一天 GO -- 月初,计算给定日期所在月的第一天DECLARE @Date DATETIMESET @Date=GETDATE()--前一天,给定日期的前一天SELECT DATEADD(DAY,-1,@Date) AS 前一天--后一天,给定日期的后一天SELECT DATEADD(DAY,1,@Date) AS 后一天GO--月初,计算给定日期所在月的第一天--这个计算的技巧是先计算当前日期到“1900-01-01”的时间间隔数,然后把它加到“1900-01-01”上来获得特殊的日期,这个技巧可以用---来计算很多不同的日期。
DECLARE @Date DATETIMESET @Date=GETDATE()SELECT DATEADD(MONTH,DATEDIFF(MONTH,1900-01-01,@Date),1900-01-01) AS 所在月的第一天--精简算法,根据SQL Server的时间表示方式可知,1900-01-01 可以用0代替SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0) AS 所在月的第一天--上面两种算法精确到天时分秒均为00:00:00.000--下面算法课以保留时分秒--思路:用给定日期减去月第一天与给定日期差的天数SELECT DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)GO--月末,计算给定日期所在月的最后一天DECLARE @Date DATETIMESET @Date=GETDATE()--思路:当前月的下一月1号在减1天SELECTDATEADD(DAY,-1,DATEADD(MONTH,1+DATEDIFF(MONTH,1900-01-01,@Date),1900-01-01)) AS 所在月的最一天SELECT DATEADD(MONTH,1+DATEDIFF(MONTH,1900-01-01,@Date),1900-01-01)-1 AS 所在月的最一天--1900-01-01 用0代替SELECT DATEADD(DAY,-1,DATEADD(MONTH,1+DATEDIFF(MONTH,0,@Date),0)) AS 所在月的最一天SELECT DATEADD(MONTH,1+DATEDIFF(MONTH,0,@Date),0)-1 AS 所在月的最一天--思路:与月初计算思路相同SELECT DATEADD(MONTH,DATEDIFF(MONTH,1989-12-31,@Date),1989-12-31) AS 所在月的最一天--精简算法,1989-12-31 用-1代替SELECT DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date),-1) AS 所在月的最一天--保留时分秒的算法SELECT DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date))) GO--其他月计算--计算给定日期所在月的上月第一天DECLARE @Date DATETIMESET @Date=GETDATE()--当前月第一天减去一个月SELECT DATEADD(MONTH,-1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)) AS 上月第一天--简化SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)-1,0) AS 上月第一天--另一种当前月第一天算法SELECT DATEADD(MONTH,-1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) 上月第一天GO--计算给定日期所在月的上月最后一天DECLARE @Date DATETIMESET @Date=GETDATE()--当前月第一天减去一天SELECT DATEADD(DAY,-1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)) AS 上月最后一天--另一种当前月第一天算法SELECT DATEADD(DAY,-1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) 上月最后一天SELECT DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)-1 上月最后一天--另一种算法,不能用当前月的最后一天加一个月,因为当前月可能是30天。
--例如 SELECT DATEADD(MONTH,1,2010-06-30) --结果是2010-07-30而不是2010-07-31,--这也是月末算法采用下月第一天减1天计算的原因--但是如果计算月是31天择无此问题--例如 SELECT DATEADD(MONTH,1,2010-05-31) --结果是2010-06-30--因此下面算法是正确的,-1 表示1899-12-31 00:00:00.000-- SELECT CONVERT(DATETIME,-1)SELECT DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date)-1,-1)--另一种当前月算法SELECT DATEADD(DAY,-1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) 上月最后一天--简化SELECT DATEADD(DAY,0-DATEPART(DAY,@Date),@Date) 上月最后一天GO--计算给定日期所在月的下月第一天DECLARE @Date DATETIMESET @Date=GETDATE()--当前月第一天加一个月SELECT DATEADD(MONTH,1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)) AS 下月第一天--简化SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)+1,0) AS 下月第一天--另一种当前月第一天算法SELECT DATEADD(MONTH,1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) 下月第一天GO--计算给定日期所在月的下月最后一天DECLARE @Date DATETIMESET @Date=GETDATE()--当前月第一天加2个月再减去1天SELECT DATEADD(DAY,-1,DATEADD(MONTH,2,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0))) AS 下月最后一天--简化SELECT DATEADD(DAY,-1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)+2,0)) AS 下月最后一天SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)+2,0)-1 AS 下月最后一天--另一种算法SELECT DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date)+1,-1) 下月最后一天--另一种当前月第一天算法SELECT DATEADD(DAY,-1,DATEADD(MONTH,2,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date))) 下月最后一天GO--所在星期的第一天,计算给定日期所在星期的第1天(星期日为第一天)DECLARE @Date DATETIMESET @Date= GETDATE()--与SQL Server语言版本相关的算法--思路:当前日期+星期日(每周的第1天)与当前日期的差的天数--DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关SET DATEFIRST 7 -- 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天) SELECT DATEADD(WEEKDAY,1-DATEPART(WEEKDAY,@Date),@Date) AS 所在星期的第一天,星期日--星期日,与SQL Server语言版本或@@DATEFIRST无关--1989-12-31 是星期日,1989-12-31 再加上(当前日期与1989-12-31差的星期数)个星期SELECT DATEADD(WEEK,DATEDIFF(WEEK,-1,@Date),-1) AS 所在星期的星期日--或者SELECT DATEADD(WEEK,DATEDIFF(WEEK,6,@Date),6) AS 所在星期的星期日GO--所在星期的第二天,计算给定日期所在星期的第2天(星期日为第一天)DECLARE @Date DATETIMESET @Date= GETDATE()--思路:当前日期+星期一(每周的第2天)与当前日期的差的天数--DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关SET DATEFIRST 7 -- 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天) SELECT DATEADD(DAY,2-DATEPART(WEEKDAY,@Date),@Date) AS 所在星期的第二天,星期一--星期一,与SQL Server语言版本或@@DATEFIRST无关--1900-01-01 是星期一,1900-01-01 再加上(当前日期与1900-01-01差的星期数)个星期SELECT DATEADD(WEEK,DATEDIFF(WEEK,0,@Date),0) AS 所在星期的星期一GO--上个星期第一天,计算给定日期所在星期的上一个星期日(星期日为第一天)DECLARE @Date DATETIMESET @Date= GETDATE()--思路:当前日志所在星期的星期日再减1周--DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关SET DATEFIRST 7 -- 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天) SELECT DATEADD(WEEK,-1,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS 上个星期第一天,星期日--一周等于7天SELECT DATEADD(DAY,-7,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS 上个星期第一天,星期日--简化SELECT DATEADD(DAY,-6-DATEPART(WEEKDAY,@Date),@Date) AS 上个星期第一天,星期日--上个星期日,与SQL Server语言版本或@@DATEFIRST无关SELECT DATEADD(WEEK,-1+DATEDIFF(WEEK,-1,@Date),-1) AS 上个星期日--或者SELECT DATEADD(WEEK,DATEDIFF(WEEK,6,@Date),-1) AS 上个星期日GO--下个星期第一天,计算给定日期所在星期的下一个星期日(星期日为第一天)DECLARE @Date DATETIMESET @Date= GETDATE()--思路:当前日志所在星期的星期日再加1周--DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关SET DATEFIRST 7 -- 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天) SELECT DATEADD(WEEK,1,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS 下个星期第一天,星期日--一周等于7天SELECT DATEADD(DAY,7,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS 下个星期第一天,星期日--简化SELECT DATEADD(DAY,8-DATEPART(WEEKDAY,@Date),@Date) AS 下个星期第一天,星期日--下个星期日,与SQL Server语言版本或@@DATEFIRST无关SELECT DATEADD(WEEK,1+DATEDIFF(WEEK,-1,@Date),-1) AS 下个星期日--或者SELECT DATEADD(WEEK,DATEDIFF(WEEK,-1,@Date),6) AS 下个星期日GO--判断给定日期是星期几DECLARE @Date DATETIMESET @Date= GETDATE()--DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关SET DATEFIRST 7 -- 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天) SELECT DATEPART(WEEKDAY,@Date) --返回值 1-星期日,2-星期一,3-星期二......7-星期六--上面算法与SQL 语言版本或 @@DATEFIRST 相关--下面算法与SQL Server语言版本或@@DATEFIRST无关SELECT DATENAME(WEEKDAY,@Date) 星期GO--年度计算DECLARE @Date DATETIMESET @Date=GETDATE()--年初,计算给定日期所在年的第一天SELECT DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),0) AS 所在年的第一天--年末,计算给定日期所在年的最后一天SELECT DATEADD(YEAR,DATEDIFF(YEAR,-1,@Date),-1) AS 所在年的最后一天--上一年年初,计算给定日期所在年的上一年的第一天SELECT DATEADD(YEAR,DATEDIFF(YEAR,-0,@Date)-1,0) AS 所在年的上一年的第一天--上一年年末,计算给定日期所在年的上一年的最后一天SELECT DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),-1) AS 所在年的上一年的最后一天--下一年年初,计算给定日期所在年的下一年的第一天SELECT DATEADD(YEAR,1+DATEDIFF(YEAR,0,@Date),0) AS 所在年的下一年的第一天--下一年年末,计算给定日期所在年的下一年的最后一天SELECT DATEADD(YEAR,1+DATEDIFF(YEAR,-1,@Date),-1) AS 所在年的下一年的最后一天GO--季度计算DECLARE @Date DATETIMESET @Date=GETDATE()--季度初,计算给定日期所在季度的第一天SELECT DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date),0) AS 当前季度的第一天--季度末,计算给定日期所在季度的最后一天SELECT DATEADD(QUARTER,1+DATEDIFF(QUARTER,0,@Date),-1) AS 当前季度的最后一天--上个季度初SELECT DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date)-1,0) AS 当前季度的上个季度初--上个季度末SELECT DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date),-1) AS 当前季度的上个季度末--下个季度初SELECT DATEADD(QUARTER,1+DATEDIFF(QUARTER,0,@Date),0) AS 当前季度的下个季度初--下个季度末SELECT DATEADD(QUARTER,2+DATEDIFF(QUARTER,0,@Date),-1) AS 当前季度的下个季度末GO。