SQL Server各种日期计算

最新更新时间:2013-09-24来源: 互联网关键字:SQL  Server  日期计算 手机看文章 扫描二维码
随时随地手机看文章

通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。你们大部分人大概都知道怎样把日期进行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几个函数中计算出自己所需要的日期!在这篇文章里,我将告诉你如何使用DATEADD和DATEDIFF函数来计算出在你的程序中可能你要用到的一些不同日期。

  在使用本文中的例子之前,你必须注意以下的问题。大部分可能不是所有例子在不同的机器上执行的结果可能不一样,这完全由哪一天是一个星期的第一天这个设置决定。第一天(DATEFIRST)设定决定了你的系统使用哪一天作为一周的第一天。所有以下的例子都是以星期天作为一周的第一天来建立,也就是第一天设置为7.假如你的第一天设置不一样,你可能需要调整这些例子,使它和不同的第一天设置相符合。当然,你可以通过@@DATEFIRST函数来检查第一天设置。

  一、为了理解这些例子,我们先复习一下DATEDIFF和DATEADD函数。DATEDIFF函数计算两个日期之间的小时、天、周、月、年等时间间隔总数。DATEADD函数计算一个日期通过给时间间隔加减来获得一个新的日期。要了解更多的DATEDIFF和DATEADD函数以及时间间隔可以阅读微软联机帮助。

  使用DATEDIFF和 DATEADD函数来计算日期,和本来从当前日期转换到你需要的日期的考虑方法有点不同。你必须从时间间隔这个方面来考虑。比如,从当前日期到你要得到的日期之间有多少时间间隔,或者,从今天到某一天(比如1900-1-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”上来获得特殊的日期,这个技巧可以用来计算很多不同的日期。下一个例子也是用这个技巧从当前日期来产生不同的日期。

  2.本周的星期一这里我是用周(wk)的时间间隔来计算哪一天是本周的星期一。

  SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)

  3.一年的第一天现在用年(yy)的时间间隔来显示这一年的第一天。

  SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

  4.季度的第一天假如你要计算这个季度的第一天,这个例子告诉你该如何做。

  SELECT DATEADD(QQ, DATEDIFF(qq,0,getdate()), 0)

  5.当天的半夜曾经需要通过getdate()函数为了返回时间值截掉时间部分,就会考虑到当前日期是不是在半夜。假如这样,这个例子使用DATEDIFF和DATEADD函数来获得半夜的时间点。

  SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

二、深入DATEDIFF和DATEADD函数计算你可以明白#e# 二、深入DATEDIFF和DATEADD函数计算你可以明白,通过使用简单的DATEDIFF和DATEADD函数计算,你可以发现很多不同的可能有意义的日期。

  目前为止的所有例子只是仅仅计算当前的时间和“1900-01-01”之间的时间间隔数量,然后把它加到“1900-01-01”的时间间隔上来计算出日期。假定你修改时间间隔的数量,或者使用不同的时间间隔来调用DATEADD函数,或者减去时间间隔而不是增加,那么通过这些小的调整你可以发现和多不同的日期。

  这里有四个例子使用另外一个DATEADD函数来计算最后一天来分别替换DATEADD函数前后两个时间间隔。

  1.上个月的最后一天这是一个计算上个月最后一天的例子。它通过从一个月的最后一天这个例子上减去3毫秒来获得。有一点要记住,在Sql Server中时间是精确到3毫秒。这就是为什么我需要减去3毫秒来获得我要的日期和时间。

  SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

  计算出来的日期的时间部分包含了一个Sql Server可以记录的一天的最后时刻(“23:59:59:997”)的时间。

  2.去年的最后一天连接上面的例子,为了要得到去年的最后一天,你需要在今年的第一天上减去3毫秒。

  SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))

  3.本月的最后一天现在,为了获得本月的最后一天,我需要稍微修改一下获得上个月的最后一天的语句。修改需要给用DATEDIFF比较当前日期和“1900-01-01” 返回的时间间隔上加1.通过加1个月,我计算出下个月的第一天,然后减去3毫秒,这样就计算出了这个月的最后一天。这是计算本月最后一天的SQL脚本。

  SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

  4.本年的最后一天你现在应该掌握这个的做法,这是计算本年最后一天脚本SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。

  5.本月的第一个星期一好了,现在是最后一个例子。这里我要计算这个月的第一个星期一。这是计算的脚本。

  select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0)

  在这个例子里,我使用了“本周的星期一”的脚本,并作了一点点修改。修改的部分是把原来脚本中“getdate()”部分替换成计算本月的第6天,在计算中用本月的第6天来替换当前日期使得计算可以获得这个月的第一个星期一。

  三、总结我希望这些例子可以在你用DATEADD和DATEDIFF函数计算日期时给你一点启发。通过使用这个计算日期的时间间隔的数学方法,我发现为了显示两个日期之间间隔的有用历法是有价值的。注意,这只是计算出这些日期的一种方法。要牢记,还有很多方法可以得到相同的计算结果。假如你有其他的方法,那很不错,要是你没有,我希望这些例子可以给你一些启发,当你要用DATEADD和DATEDIFF函数计算你程序可能要用到的日期时。

  附录,其他日期处理方法1)去掉时分秒declare @ datetime set @ = getdate() ——‘2003-7-1 10:00:00’SELECT @,DATEADD(day, DATEDIFF(day,0,@), 0)

  2)显示星期几select datename(weekday,getdate())

  3)如何取得某个月的天数declare @m int set @m=2 ——月份select datediff(day,‘2003-’+cast(@m as varchar)+‘-15’ ,‘2003-’+cast(@m+1 as varchar)+‘-15’)

  另外,取得本月天数select datediff(day,cast(month(GetDate()) as varchar)+‘-’+cast(month(GetDate()) as varchar)+‘-15’ ,cast(month(GetDate()) as varchar)+‘-’+cast(month(GetDate())+1 as varchar)+‘-15’)

  或者使用计算本月的最后一天的脚本,然后用DAY函数区最后一天SELECT Day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)))

  4)判断是否闰年:SELECT case day(dateadd(mm, 2, dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)))) when 28 then ‘平年’ else ‘闰年’ end或者select case datediff(day,datename(year,getdate())+‘-02-01’,dateadd(mm,1,datename(year,getdate())+‘-02-01’))

  when 28 then ‘平年’ else ‘闰年’ end 5)一个季度多少天declare @m tinyint,@time smalldatetime select @m=month(getdate())

  select @m=case when @m between 1 and 3 then 1 when @m between 4 and 6 then 4 when @m between 7 and 9 then 7 else 10 end select @time=datename(year,getdate())+‘-’+convert(varchar(10),@m)+‘-01’select datediff(day,@time,dateadd(mm,3,@time))

  四、示例总结:declare @ datetime set @ = '1995-02-25 11:00:50' —— 1995-01-01 正好是?星期日select @ as 日期,dateadd(year,datediff(year,0,@),0) as 所在年的第一天,dateadd(year,1+datediff(year,0,@),0)-1 as 所在年的最后一天,dateadd(quarter,datediff(quarter,0,@),0) as 所在季的第一天,dateadd(quarter,1+datediff(quarter,0,@),0)-1 as 所在季的最后一天,dateadd(month,datediff(month,0,@),0) as 所在月的第一天,dateadd(month,1+datediff(month,0,@),0)-1 as 所在月的最后一天,dateadd(week,datediff(week,0,@),0) as 所在周的第一天,dateadd(week,1+datediff(week,0,@),0)-1 as 所在周的最后一天

  五、多个示例:——a.本月的第一天selectdateadd(mm,datediff(mm,0,getdate()),0)AS本月的第一天——b.本月的最后一天selectdateadd(ms,-3,dateadd(mm,datediff(mm,0,getdate())+1,0))AS本月的最后一天——c.上个月的最后一天selectdateadd(ms,-3,dateadd(mm,datediff(mm,0,getdate()),0))AS上个月的最后一天——d.本周的星期一selectdateadd(wk,datediff(wk,0,getdate()),0)AS本周的星期一——e.本季度的第一天selectdateadd(qq,datediff(qq,0,getdate()),0)AS本季度的第一天——f.本季度的最后一天selectDATEADD(ms,-3,dateadd(qq,datediff(qq,0,getdate())+1,0))AS本季度的最后一天——g.本月的第一个星期一selectdateadd(wk,datediff(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())),0)AS本月的第一个星期一——h.本年的第一天selectdateadd(yy,datediff(yy,0,getdate()),0)AS本年的第一天——i.本年的最后一天selectdateadd(ms,-3,dateadd(yy,datediff(yy,0,getdate())+1,0))AS本年的最后一天——f.去年的最后一天selectdateadd(ms,-3,dateadd(yy,datediff(yy,0,getdate()),0))AS去年的最后一天

关键字:SQL  Server  日期计算 编辑:神话 引用地址:SQL Server各种日期计算

上一篇:基于嵌入式技术的汽车安全防御系统设计
下一篇:基于DSP的室内扩声系统的研究

推荐阅读最新更新时间:2023-10-12 20:48

C语言根据日期判断星期几(使用基姆拉尔森计算公式)
算法如下: 基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数,m表示月份数,y表示年数。 注意:在公式中有个与其他公式不同的地方: 把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。 以公元元年为参考,公元元年1月1日为星期一 /PRE PRE 程序如下: #include "stdio.h" void CaculateWeekDay(int y,int m, int d) { if(m==1||m==2) { m+=12; y-
[单片机]
GKD-Base PL/SQL存储函数实现的关键技术研究
摘要:介绍具有自主知识产权的某安全数据库管理系统GKD-Base的PL/SQL引擎,基于该引擎研究GKD-Base存储函数机制实现的关键技术。设计了函数管理器和执行状态堆栈,通过语法树表示存储函数编译后生成的中间代码,并解决了中间代码的执行问题。最后实现了IN、OUT、INOUT三种参数模式函数的参数传递机制。 关键词:存储函数 过程式SQL语言 PL/SQL 函数管理器 执行状态堆栈 GKD-Base是一个具有自主知识产权的安全数据库管理系统。经过十几年的发展和试点应用,已经证明该系统是稳定和安全可靠的。但是,随着应用需求向深度和广度的发展,GKD-Base在很多方面暴露出不足,如不支持过程式SQL语言、不支持存储过程和函数
[应用]
基于GR47和MCU的无线嵌入式Web Server
引言 嵌入式Web Server具有灵活性、前沿性和解决问题的有效性等优点,在网络智能设备中发挥着越来越重要的作用。本文依托GPRS(通用分组无线电业务)网络来实现嵌入式Web Server的方法,实现了远程无线接人嵌入式Web Server。 嵌入式Web Server是一个简单易用的网络服务器,用户可通过IE访问服务器的IP看到Web页面。嵌入式Web Server的原理是把Web Server作为一个数据载体,Web Server监听用户端的服务请求,根据用户请求类型提供相应的服务,用户端使用Web浏览器和Web服务器进行通信。Web服务器在接收到用户端请求后,处理用户请求并返回需要的数据,一
[单片机]
GKD-BASE PL/SQL引擎实现关键技术研究
摘要:在数据库管理系统GKD-BASE上设计并实现了兼容Oracle PL/SQL V2.3语言规范的PL/SQL引擎,扩展了GKD-BASE过程处理功能。 关键词:过程语言PL/SQL符号表 游标 GKD-BASE数据库是一个具有自主知识产权的数据库管理系统,具有兼容SQL89标准的SQL引擎,能够为用户提供一个统一、有效的数据库访问接口,实现对数据库的各种操作。但是SQL语言缺乏对算法的描述能力,难以胜任复杂的程序设计。为了融合SQL语言强大的集合数据处理能力和第三代语言(3GL)灵活的过程处理能力,主流数据库管理系统产品都已提供了对过程式SQL语言的支持,如Oracle的PL/SQL[1]。为了使GKD-BASE适应发
[应用]
Quantum Q-Server平台将加速IoT建设
智能家居集成越来越受到用户欢迎,但通常只有在先进的全屋系统下才有可能实现。Quantum Intergration 的IoT平台为用户提供全面的控制;无论是新手还是专家,任何人都可以建立一个强大的物联网网络,它可以控制从简单的按钮到复杂的家庭集成系统的任何东西。 如何控制智能家居?可以说,家庭自动化系统最重要的组成部分是输入设备。如果没有一个好的方法来控制在自动化家庭中运行的所有强大的技术,它就不能发挥全部潜力。Q-Server是物联网平台的核心,它为整个物联网网络上的用户提供了完全的控制,可以说是这个应用程序的完美选择。 有了Q-Server,构建基于物联网的项目就爱那个会变得更容易。它可以为你的构建库定制固件,编
[物联网]
Quantum Q-<font color='red'>Server</font>平台将加速IoT建设
SQL Server各种日期计算
通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。你们大部分人大概都知道怎样把日期进行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几个函数中计算出自己所需要的日期!在这篇文章里,我将告诉你如何使用DATEADD和DATEDIFF函数来计算出在你的程序中可能你要用到的一些不同日期。   在使用本文中的例子之前,你必须注意以下的问题。大部分可能不是所有例子在不同的机器上执行的结果可能不一样,这完全由哪一天是一个星期的第一天这个设置决定。第一天(DATEFIRST)设定决定了你的系统使用哪一天作为一周的第一天。所有以下的例子都是以星期天作为一周的第一天来建立,也就是第
[模拟电子]
GKD-Base PL/SQL存储函数实现的关键技术研究
摘要:介绍具有自主知识产权的某安全数据库管理系统GKD-Base的PL/SQL引擎,基于该引擎研究GKD-Base存储函数机制实现的关键技术。设计了函数管理器和执行状态堆栈,通过语法树表示存储函数编译后生成的中间代码,并解决了中间代码的执行问题。最后实现了IN、OUT、INOUT三种参数模式函数的参数传递机制。 关键词:存储函数 过程式SQL语言 PL/SQL 函数管理器 执行状态堆栈 GKD-Base是一个具有自主知识产权的安全数据库管理系统。经过十几年的发展和试点应用,已经证明该系统是稳定和安全可靠的。但是,随着应用需求向深度和广度的发展,GKD-Base在很多方面暴露出不足,如不支持过程式SQL语言、不支持存储过程和函数
[网络通信]
小广播
热门活动
换一批
更多
最新模拟电子文章
更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved