SQL Server日期计算

 更新时间:2007年03月12日 00:00:00   作者:  

去年的最后一天  
连接上面的例子,为了要得到去年的最后一天,你需要在今年的第一天上减去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函数计算日期时给你一点启发。通过使用这个计算日期的时间间隔的数学方法,我发现为了显示两个日期之间间隔的有用历法是有价值的。注意,这只是计算出这些日期的一种方法。要牢记,还有很多方法可以得到相同的计算结果。假如你有其他的方法,那很不错,要是你没有,我希望这些例子可以给你一些启发,当你要用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))  

相关文章

  • 数据库表的查询操作实践演练(实验三)

    数据库表的查询操作实践演练(实验三)

    这篇文章主要对数据库表的查询操作进行实践演练,针对实验一和实验二涉及到的内容进一步深入学习,进一步理解关系运算,巩固数据库的基础知识,感兴趣的小伙伴可以参考一下
    2015-08-08
  • sqlserver数据库导入方法的详细图文教程

    sqlserver数据库导入方法的详细图文教程

    导入数据也是数据库操作中使用频繁的功能,下面这篇文章主要给大家介绍了关于sqlserver数据库导入方法的详细图文教程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • SQL Server 使用 Pivot 和 UnPivot 实现行列转换的问题小结

    SQL Server 使用 Pivot 和 UnPivot 

    对于行列转换的数据,通常也就是在做报表的时候用的比较多,今天就通过本文给大家总结下SQL Server 使用 Pivot 和 UnPivot 实现行列转换的问题小结,感兴趣的朋友一起看看吧
    2022-01-01
  • 自动清理 MSSQL Server Table Collation问题的解决方法

    自动清理 MSSQL Server Table Collation问题的解决方法

    Cannot resolve the collation conflict between "Latin1_General_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation
    2013-02-02
  • SQL Server 2016 TempDb里的显著提升

    SQL Server 2016 TempDb里的显著提升

    SQL Server 2016的最新CTP版本已经发布了:CTP 2.4(目前已经是CTP 3.0)。这个预览版相比以前的CTP包含了很多不同的提升,此篇文章给大家介绍SQL Server 2016 TempDb里的显著提升,小伙伴一起来了解了解吧
    2015-11-11
  • SQL Server行列转换的实现示例

    SQL Server行列转换的实现示例

    在使用SQL Server数据库的过程中我们经常会遇到需要将行数据和列数据相互转换显示的问题,本文就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • SQLServer中NEWID()函数用于生成一个唯一的标识符的方法实践

    SQLServer中NEWID()函数用于生成一个唯一的标识符的方法实践

    NEWID函数用于生成一个唯一的标识符,本文主要介绍了SQLServer中NEWID()函数用于生成一个唯一的标识符的方法实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • 分区表场景下的 SQL 优化

    分区表场景下的 SQL 优化

    这篇文章主要介绍了分区表场景下的 SQL 优化,帮助大家更好的理解和学习SQL,感兴趣的朋友可以了解下
    2020-08-08
  • MAC 中mysql密码忘记解决办法

    MAC 中mysql密码忘记解决办法

    这篇文章主要介绍了MAC 中mysql密码忘记解决办法的相关资料,需要的朋友可以参考下
    2017-03-03
  • SQLServer2005创建定时作业任务

    SQLServer2005创建定时作业任务

    这篇文章主要为大家介绍了SQLServer2005创建定时作业任务的详细过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12

最新评论