问题描述:我们在写存储过程和函数的时候经常会碰到利用当前日期计算出上周开始日期、结束日期,或者计算上个月的开始日期结束日期等问题。最近写了几个存储过程和函数,其中都涉及到了日期计算问题,在这里简单做一个总结,留待以后查阅。

涉及知识分享:SQL中的日期计算主要涉及到GETDATE()、DATEDIFF()和DATEADD()三个方法,利用这三个方法的巧妙组合就可以得到我们想要的日期结果。首先,简单介绍一下这三个方法的定义:

(1)GETDATE():

定义:从 SQL Server 返回当前的时间和日期;

语法:GETDATE(),没有参数;

示例:select GETDATE();

结果:2016-04-26 13:35:14.670

(2)DATEDIFF()

定义:返回两个日期之间的天数;

语法:DATEDIFF(datepart,startdate,enddate), startdateenddate 参数是合法的日期表达式。datepart 参数可以是下列的值:

示例:select DATEDIFF(dd,'2016-4-21','2016-4-26');

结果:5

(3)DATEADD():

定义:在日期中添加或减去指定的时间间隔;

语法:DATEADD(datepart,number,date), date 参数是合法的日期表达式。number 是您希望添加的间隔数;对于未来的时间,此数是正数,对于过去的时间,此数是负数。datepart 参数与DATEDIFF的datepart 参数一致,参见上表。

示例:select DATEADD(dd,5,'2016-4-21');

结果:2016-04-26 00:00:00.000

具体日期计算示例:

(1)得到当前日期:

SQL: select GETDATE();

结果:2016-04-26 13:47:06.903

(2)得到本周周一日期:

SQL: select DATEADD(week,DATEDIFF(week,0,GETDATE()),0)

结果:2016-04-25 00:00:00.000

(3)得到上周周一日期(在本周周一的基础上剪掉一周即可):

SQL: select  DATEADD(week,-1,DATEADD(week,DATEDIFF(week,0,GETDATE()),0))

结果:2016-04-18 00:00:00.000

(4)得到上周周日日期,举其中两种思维方法:

第一种:先得到本周周日的日期,然后减一周

SQL: select dateadd(week,-1,DATEADD(week,DATEDIFF(week,0,getdate()),6))

结果:2016-04-24 00:00:00.000

第二种:用本周周一的日期减掉1秒

SQL: select DATEADD(ss,-1,DATEADD(week,DATEDIFF(week,0,GETDATE()),0))

结果:2016-04-24 23:59:59.000

(5)得到本月第一天日期:

SQL: select DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0)

结果:2016-04-01 00:00:00.000

(6)得到上个月第一天日期(即在本月第一天日期取月的间隔数时减一即可):

SQL: select DATEADD(MM,DATEDIFF(MM,0,GETDATE())-1,0)

结果:2016-03-01 00:00:00.000

(7)得到上个月最后一天日期(即在本月第一天的基础上减掉一秒即可):

SQL: select DATEADD(SS,-1,DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0))

结果:2016-03-31 23:59:59.000

关于计算两个日期间隔数DATEDIFF函数的参数0对应的日期时间问题:

在使用DATEDIFF计算日期时经常会用到参数0,参数0对应的日期是默认的日期1900-00-00 00:00:00.000,具体得到的计算间隔数由datepart参数决定。例如:

SQL:select DATEDIFF(yy,0,GETDATE()) as countYear,DATEDIFF(mm,0,GETDATE()) as countMonth,DATEDIFF(dd,0,GETDATE()) as countDay,DATEDIFF(week,0,GETDATE()) as countWeek,DATEDIFF(hh,0,GETDATE()) as countHour

结果:

  countYear countMonth countDay countWeek countHour
1 116 1395 42485 6069 1019649

最新文章

  1. 数据结构(DataStructure)与算法(Algorithm)、STL应用
  2. uva 111 - History Grading (dp, LCS)
  3. SQL server 如何修改登录名和密码
  4. Echarts使用随笔(1)-Echarts中markPoint的使用(静态、动态)-effect
  5. javascript 关闭窗口,弹出新窗口并带有确认关闭对话框解决办法
  6. 表达式求值(河南省第四届ACM试题-C题)题解
  7. hive第二篇----hive中partition如何使用
  8. 读书笔记 effective c++ Item 50 了解何时替换new和delete 是有意义的
  9. requireJS 源码(二) data-main 的加载实现
  10. Java 最常用类(前100名)来自一万个开源项目
  11. 运行所选代码生成器时出错:“预期具有协定名称 "NuGet.VisualStudio.IVsPackageInstallerServices" 的1导出 ——VS2015错误记录
  12. [爬虫]爬虫时碰到的IOError: [Errno ftp error] [Errno 10060]错误的原因以及解决方法
  13. java导出数据到excel里:直接导出和导出数据库数据
  14. 【BZOJ1823】【JSOI2010】满汉全席
  15. jdk1.8配置环境变量
  16. 关于ThinkPHP的一些编程技巧
  17. CentOS 6.5 搭建NFS文件服务器
  18. 1:4 UI标签和通用标签
  19. POJ 2499 A*求第K短路
  20. Class^=,Class*= ,Class$=含义(转)

热门文章

  1. 什么是遗传方差(Genetic variance)、加性遗传方差(Additive genetic variance)、显性遗传方差(Dominance genetic variance)、上位遗传方差(Epistatic genetic variance)
  2. ng-repeat产生的对象会带有$$hashkey属性处理方法
  3. js之字符串操作
  4. 如何取消MSSQL自带智能提示步骤,使用第三方智能提示插件
  5. 关于oracle 10g creating datafile with zero offset for aix
  6. 2-2. Initializing Objects with Initializer Lists
  7. Ceph剖析:故障检测
  8. rem介绍
  9. 【转】Nginx服务器详细配置含注释
  10. iis下设置php最大执行时间