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

涉及知识分享: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

数据库SQL语句中根据当前日期计算其他日期小结的更多相关文章

  1. 数据库SQL语句中 查询选修了全部课程的学生的学号和姓名

    一.SQL语言查询选修了全部课程的学生的学号和姓名. 两种解决途径: 第一种: 我们可以表示为在SC表中某个学生选修的课程数等于C表中课程总数.相应的SQL语言如下: select S#,SNAME ...

  2. Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)

    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项) A.cat B.concat C.join D.+ 解答:B

  3. SQL语句中日期的计算方法大全

    sql语句中的日期处理一.日期處理函數1.日期增減函數 dateadd(datepart,number,dtae) datepart:是規定應向日期的哪一部分返回新值的參數.下列是sql server ...

  4. 学生选课数据库SQL语句45道练习题整理及mysql常用函数(20161019)

    学生选课数据库SQL语句45道练习题: 一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四 ...

  5. 数据库 SQL语句优化

    温馨提示:本篇内容均来自网上,本人只做了稍微处理,未进行细致研究,仅当做以后不备之需,如若你喜欢可尽情转走. 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图 ...

  6. (转载)SQL语句中Group by语句的详细介绍

    转自:http://blog.163.com/yuer_d/blog/static/76761152201010203719835 SQL语句中Group by语句的详细介绍              ...

  7. SQL点滴35—SQL语句中的exists

    原文:SQL点滴35-SQL语句中的exists 比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHE ...

  8. 数据库SQL语句性能优化

    选择最有效率的表名顺序 ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下 ...

  9. sql语句中的[]中括号(转)

    下面有关sql语句中[]的信息适用于Sql Server.Access等多种数据库. 1.sql语句中加[]是为了防止歧义,避免与系统保留关键字冲突,使计算机能识别.sql语句中有些字段可能是关键字, ...

随机推荐

  1. webapp开发中的一些注意的

    和大多数响应式的布局一样,webapp开发也是需要浮动布局和百分比布局,需要考虑的是小屏幕手机250px和大屏幕设备768px,但是习惯以320px和640px来分割,jq中的一句话$(functio ...

  2. Ubuntu如何更新源

    Ubuntu的源其实就是更新各种软件包需要用到镜像网站, 当大家在虚拟机上安装Linux镜像的时候肯定会遇到各种Linux软件没有安装,当你用apt-get安装的时候它会提示无效的网址,这个时候你就需 ...

  3. AWT布局管理器

    布局管理器 容器内可以存放各种组件,而组件的位置和大小是由容器内的布局管理器来决定的.在AWT中为我们提供了以下5种布局管理器: ①   FlowLayout 流式布局管理器 ②   BorderLa ...

  4. 双系统下(Ubuntu + win7)windows 无法连接无线网络

    双系统下(Ubuntu + win7)windows 无法连接无线网络 今天开机登录win7,突然发现无法使用无线网络(WiFi信号标志有个大红叉),于是查看设备驱动,一切正常,这就奇怪了:用Wind ...

  5. js 让浏览器全屏模式的方法launchFullscreen

    浏览器全屏模式的启动函数requestFullscreen仍然需要附带各浏览器的js方言前缀 // 判断各种浏览器,找到正确的方法 function launchFullscreen(element) ...

  6. Numpy Python

    如果一个数组太长,则NumPy自动省略中间部分而只打印两端的数据: 可通过设置printoptions参数来禁用NumPy的这种行为并强制打印整个数组. set_printoptions(thresh ...

  7. ABP 仓储VIEW实现

    每个view实体加个ID 对应实体属性配置到View的列 View添加一列类似自增序列 ROW_NUMBER() OVER(ORDER BY getdate()) AS ID codefirst时 删 ...

  8. 使用JS脚本获取url中的参数

    第一种方式:使用分隔符及循环查找function getQueryString(name) { // 如果链接没有参数,或者链接中不存在我们要获取的参数,直接返回空 if(location.href. ...

  9. Oracle Cursor

    1.概念 游标:从字面来理解就是游动的光标.用数据库语言来描述,游标是映射在结果集中一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了.将游标放置到某行后,即可对该行数据进行操作, ...

  10. (一)startup.bat

    那么startup.bat(// TODO startup.sh暂缓)启动后发生了什么呢? @echo off rem Licensed to the Apache Software Foundati ...