本文主要介绍DATEADD和DATEDIFF在SQL中的用法,有需要的朋友可以参考一下。
通常,您需要获取当前日期并计算一些其他日期。例如,您的程序可能需要判断一个月的第一天或最后一天。你们大多数人可能知道如何划分日期(年、月、日等。),然后就用分好的年、月、日等。在几个函数中计算出你需要的日期!
在本文中,我将告诉您如何使用DATEADD和DATEDIFF函数来计算一些您可能在程序中使用的不同日期。
在使用本文中的示例之前,您必须注意以下问题。大部分的例子可能不会在不同的机器上执行,结果也可能不同,这完全是由星期几是星期几的设置决定的。第一天设置决定了系统将哪一天作为一周的第一天。以下所有示例都基于星期日作为一周的第一天,即第一天设置为7。如果您的第一天设置不同,您可能需要调整这些示例,使它们符合不同的第一天设置。您可以通过@@DATEFIRST函数检查第一天的设置。
为了理解这些例子,让我们先回顾一下DATEDIFF和DATEADD函数。DATEDIFF函数计算两个日期之间的时间间隔总数,如小时、天、周、月和年。DATE函数计算一个日期,通过加上或减去时间间隔得到一个新的日期。若要了解DATEDIFF和DATEADD函数以及时间间隔的详细信息,可以阅读Microsoft联机帮助。
使用DATEDIFF和DATEADD函数计算日期与最初的从当前日期转换到所需日期的考虑方法略有不同。你必须考虑时间间隔。比如当前日期和你想要得到的日期之间有多少时间间隔,或者今天和某一天(比如1900年1月1日)之间有多少时间间隔等等。了解如何关注时间间隔将有助于您轻松理解我的不同日期计算示例。
一个月的第一天
对于第一个例子,我将告诉你如何从当前日期到这个月的最后一天。请注意:这个例子和本文中的其他例子将只使用DATEDIFF和DATEADD函数来计算我们想要的日期。在每个例子中,要计算的日期将通过计算之前的时间间隔,然后加减得到。
这是计算每月第一天的SQL脚本:
Select DATEADD(mm,DATEDIFF(mm,0,getdate()),0)
让我们把这个语句分开来看看它是如何工作的。核心函数是getdate(),大多数人都知道它是一个返回当前日期和时间的函数。下一个执行的函数DATEDIFF(mm,0,getdate())将计算当前日期和日期“1900-01-01 00:00:00.000”之间的月数。记住:周期和时间变量是从“1900-01-01 00:00:00.000”开始计算的,就像毫秒一样。这就是为什么可以在DATEDIFF函数中将第一个时间表达式指定为“0”。下一个函数是DATEADD,它将当前日期的月数增加到“1900-01-01”。通过增加预定义的日期“1900-01-01”和当前日期的月数,我们可以得到这个月的第一天。此外,计算日期的时间部分将是“00:00:00.000”。
这个计算的技巧是先计算出当前日期与“1900-01-01”之间的时间间隔数,再加上“1900-01-01”得到一个特殊的日期。这项技能可以用来计算许多不同的日期。下一个示例也使用这种技术从当前日期生成不同的日期。
本周的星期一
在这里,我使用周的间隔(wk)来计算哪一天是本周的星期一。
Select DATEADD(wk,DATEDIFF(wk,0,getdate()),0)
一年的第一天
现在使用一年的时间间隔(yy)来显示一年的第一天。
Select DATEADD(yy,DATEDIFF(yy,0,getdate()),0)
季度的第一天
如果你想计算这个季度的第一天,这个例子告诉你怎么做。
Select DATEADD(qq,DATEDIFF(qq,0,getdate()),0)
当天的半夜
一旦需要通过getdate()函数截断时间部分以返回时间值,它将考虑当前日期是否在午夜。在这种情况下,此示例使用DATEDIFF和DATEADD函数来获取午夜时间。
Select DATEADD(dd,DATEDIFF(dd,0,getdate()),0)
DATEDIFF和DATEADD函数的深入计算
您可以看到,通过使用简单的DATEDIFF和DATEADD函数,可以找到许多可能有意义的不同日期。
到目前为止,所有的示例都只是计算当前时间与“1900-01-01”之间的时间间隔数,然后将其添加到“1900-01-01”的时间间隔中来计算日期。假设你修改时间间隔的个数,或者用不同的时间间隔调用DATEADD函数,或者减去时间间隔而不是增加时间间隔,通过这些小的调整,你可以找到很多不同的日期。
下面是四个示例,它们使用另一个DATEADD函数来计算最后一天,以替换DATEADD函数前后的两个时间间隔。
上个月的最后一天
这是一个计算上月最后一天的例子。它是从一个月的最后一天的例子中减去3毫秒得到的。需要记住的一点是,在Sql中
服务器时间精确到3毫秒。这就是为什么我需要减去3毫秒来得到我想要的日期和时间。
Select dateadd(ms,-3,DATEADD(mm,DATEDIFF(mm,0,getdate()),0))
计算日期的时间部分包含一个Sql
服务器可以记录的一天中最后一刻的时间(“23:59:59:997”)。
去年的最后一天
在上面的例子中,为了得到去年的最后一天,需要从今年的第一天减去3毫秒。
Select dateadd(ms,-3,DATEADD(yy,DATEDIFF(yy,0,getdate()),0))
本月的最后一天
现在,为了得到这个月的最后一天,我需要稍微修改一下得到上个月最后一天的语句。修改需要在DATEDIFF将当前日期与“1900-01-01”进行比较后返回的时间间隔上加1。通过加上1个月,我算出了下个月的第一天,然后减去3毫秒,这样就算出了这个月的最后一天。这是计算本月最后一天的SQL脚本。
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)
在这个例子中,我使用了“本周星期一”的脚本,并做了一点修改。修改的部分是将原脚本的“getdate()”部分替换为本月6日,在计算中将当前日期替换为本月6日,这样计算就可以得到本月的第一个星期一。
总结
通过使用这种计算日期之间时间间隔的数学方法,我发现为了显示两个日期之间的间隔,一个有用的日历是有价值的。请注意,这只是计算这些日期的一种方法。请记住,有许多方法可以获得相同的计算结果。如果你有其他方法,那太好了。如果你没有,我希望这些例子能给你一些启发,当你想用DATEADD和DATEDIFF函数计算你的程序可能用到的日期时。