每日一SQL-善用DATEADD和DATEDIFF

上個星期去Tech-Day聽了幾場有趣的課,其中一堂是楊志強老師的

"深入了解T-SQL",講的很棒,雖然是第一堂八點四十的課,但講得很精采,讓我越聽越有精神。

今天來寫一個當天的範例,應該很多人看過,但我覺得語法滿有趣的。

用DATEADD及DATEDIFF組合起來,可以算出一季或是一個月的最後一天等等…

首先先分別來說明DATEADD及DATEDIFF

DATEDIFF是算兩個日期間的間隔,傳回帶正負號的整數

DATEDIFF ( datepart , startdate , enddate )

datepart為間隔的單位,startdate跟enddate應該看字面的意思就知道了吧。

因此如果語法寫

SELECT DATEDIFF(DAY, '2010-10-03','2010-10-04'  )

出來的結果就是 1,代表相隔一天。

DATEADD是計算某日期加上一個數值,傳回的日期

DATEADD (datepart , number , date )

datepart一樣是單位,number是指定的數值,date是要被加上的原始日期

SELECT DATEADD(MONTH,2,'2010-10-06')

傳回的結果是2010-12-06 00:00:00.000

講解完這兩個函數使用之後,接著開始解釋某月的第一天怎麼計算

不過還是要再解釋一個東西

如果今天將0轉為datetime,如 select CONVERT(datetime,0,112)

出來的結果會是1900-01-01 00:00:00.000

因此我們將會用這個數值為基準

首先先計算今天到1900-01-01相差幾個月

語法是

SELECT DATEDIFF(MONTH,0,GETDATE())

算出來的數值是1329,代表相差了1329個月

再來將 1900-01-01加上1329個月,結果出來就是這個月的第一天了!

SELECT  DATEADD(MONTH,  DATEDIFF(MONTH,0,GETDATE()) ,0)

結果:2010-10-01 00:00:00.000

用這個方法就可以算出很多種不同的結果

例如如果是每個月最後一天的話,就是

SELECT DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE() ), -1)

原理是先算出今天跟 1899-12-31的月份差距( -1代表1899-12-31,-2就是1899-12-30依此類推)

接著再將1899-12-31加上月份差距,答案就是2010-10-31 00:00:00.000

如果是當季的最後一天,如下

SELECT DATEADD(QUARTER, DATEDIFF(QUARTER, -1,GETDATE() ), -1)

還有很多運用,就看自己怎麼發揮囉。

參考連結:

我的Coding之路-每日一SQL-善用DATEADD和DATEDIFF

保哥-如何用簡單的 SQL 技巧取得特定日期是否為週末假日

sql dateadd 和datediff的用法相关推荐

  1. SQL中DATEADD和DATEDIFF的用法

    通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天.你们大部分人大概都知道怎样把日期进行分割(年.月.日等),然后仅仅用分割出来的年.月.日等放在几个函 ...

  2. mysql sql dateadd_在SQL语句中DATEADD和DATEDIFF函数

    在SQL语句中DATEADD和DATEDIFF函数 DateAdd函数 返回 返回包含一个日期的 Variant (Date),这一日期还加上了一段时间间隔. 语法 DateAdd(interval, ...

  3. mysql2000日期加减,SQL日期处理函数DATEADD和DATEDIFF详解

    SQL Server数据库中,DATETIME和SMALLDATETIME的值是存储为整数的.虽然如此,SQL Server数据库并不因此支持对这两种类型的值做数学运算. 不过,我们一定会有给日期或时 ...

  4. SQL中DATEADD和DATEDIFF的使用方法

    DATEADD函数计算一个日期通过给时间间隔加减来获得一个新的日期,DATEDIFF函数计算两个日期之间的小时.天.周.月.年等时间间隔总数. 1.SQL Server DATEADD() 函数 定义 ...

  5. sql中日期函数的用法

    sql中日期函数的用法   <script src="http://blog.csdn.net/count.aspx?ID=1920773&Type=Rank" ty ...

  6. IsNull 和 SQL语句中CASE WHEN用法

    [转]IsNull 和 SQL语句中CASE WHEN用法收藏   [转]IsNull 和 SQL语句中CASE WHEN用法 1.ISNULL     使用指定的替换值替换   NULL.      ...

  7. sqlserver中的dateadd和datediff

    1.获取当前日期 -- 1.获取当前日期 select GETDATE() -- 2.获取当前日期并格式化 select CONVERT(varchar(10),GETDATE(),120) -- 3 ...

  8. SQL SERVER日期函数详细用法

    1.一个月第一天的 Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 2.本周的星期一 Select DATEADD(wk, DATEDIFF(wk,0, ...

  9. 关于dateadd与datediff的使用方法

    关于dateadd与datediff的使用方法 DATEADD函数计算一个日期通过给时间间隔加减来获得一个新的日期,DATEDIFF函数计算两个日期之间的小时.天.周.月.年等时间间隔总数. 1.SQ ...

最新文章

  1. Asp.net(C#)-彩色图片转化为黑白
  2. 【计算机科学基础】控制复杂性的艺术
  3. [JavaScript] promise中.then()方法
  4. PHP学习总结(13)——PHP入门篇之常量
  5. 不能使用泛型的形参创建对象_数据类型之----泛型
  6. [CF808B] Average Sleep Time([强行]树状数组,数学)
  7. 网络体系结构——ISO/OSI参考模型
  8. 苹果mac菜单栏应用管理软件Bartender 让Mac选项列不再拥挤
  9. c语言中字母后面的 是什么意思,C语言中括号里面一个字母是什么意思
  10. 300多分学计算机去哪个学校,300分能上什么大学 2021年300分左右的学校
  11. java编程思想笔记(一)——面向对象导论
  12. 等保三级密码技术应用要求 GM/T 0054-2018
  13. vue-自定义组件之组件的继承
  14. CentOS 添加微软雅黑字体
  15. Java实现桐桐的数学难题
  16. 苹果微信换行怎么打_微信空白朋友圈怎么发?安卓苹果双平台教程
  17. Mob研究院 |2019互联网医疗行业洞察
  18. java 公交管理系统 代码_基于jsp的公交管理系统-JavaEE实现公交管理系统 - java项目源码...
  19. 石油专业:一文入门机器学习,以测井岩性分类预测为例
  20. AutoDYN学习笔记---Part_1

热门文章

  1. 智能指纹门锁芯片方案技术开发
  2. 爱情顾问岗,雷哥成功拿到了offer
  3. 25_ue4实现二段跳,加速跑和瞬移
  4. 一个tomcat下有多个应用时 多个Context启动冲突的问题解决
  5. Focus和SetFocus、GetFocus、LoseFocus
  6. 图片饱和度更改,c#,winform
  7. A Comprehensive Survey on Graph Neural Networks(图神经网络综合研究)
  8. Trick and Magic(OO博客第二弹)
  9. liferay6.2 mysql_liferay6.2 集成CKEditor和ckfinder
  10. 基础测绘计算函数设计(坐标正反算、交会计算)