转自:http://www.dotblogs.com.tw/lastsecret/archive/2010/10/04/18097.aspx

上個星期去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. DATEADD和DATEDIFF函数、其他日期处理方法 、已打开的端口、FORMAT函数

    DATEADD和DATEDIFF函数.其他日期处理方法 .已打开的端口.FORMAT函数 DATEADD和DATEDIFF函数.其他日期处理方法 .已打开的端口.Format函数 KeyLife富翁笔 ...

  2. DATEADD(Day, DATEDIFF(Day,0,ShippingTime), 0)

    select DATEADD(Day, DATEDIFF(Day,0,GETDATE()), 0),DATEDIFF(Day,0,GETDATE()),GETDATE() 结果: (无列名) (无列名 ...

  3. SQL Server DATEADD() 函数 一步步使用教程

    SQL Server DATEADD() 函数 DATEADD() 函数在日期中添加或减去指定的时间间隔. DATEADD(datepart,number,date)date 参数是合法的日期表达式. ...

  4. DATEADD和DATEDIFF

    DateAdd函数 返回 返回包含一个日期的 Variant (Date),这一日期还加上了一段时间间隔. 语法 DateAdd(interval, number, date) DateAdd 函数语 ...

  5. SQL Server DATEADD() 函数

    SQL Server Date 函数 定义和用法 DATEADD() 函数在日期中添加或减去指定的时间间隔. 语法 DATEADD(datepart,number,date) date 参数是合法的日 ...

  6. sql server dateadd()

    定义和用法 DATEADD() 函数在日期中添加或减去指定的时间间隔. 语法 DATEADD(datepart,number,date) date 参数是合法的日期表达式.number 是您希望添加的 ...

  7. sql server 日期处理datediff

    语法: DATEDIFF(datepart,startdate,enddate) datepart 参数可以是下列的值: date-part : year | quarter | month | we ...

  8. sql 函数 DATEADD 使用

    DATEADD ( datepart , number, date ) 在日期中添加或减去指定的时间间隔.   datepart 是规定应向日期的哪一部分返回新值的参数. number 为要增加或减去 ...

  9. Sql server DATEADD日期函数的使用

    DATEADD日期函数 DATEADD() 函数在日期中添加或减去指定的时间间隔. 日:在当前日期上加两天 , ,'2014-12-30') 月:在当前日期上加两个月 , , 年:在当前日期上加两年 ...

随机推荐

  1. Android源码分析之SparseArray

    本来接下来应该分析MessageQueue了,可是我这几天正好在实际开发中又再次用到了SparseArray(之前有用到过一次,那次只是 大概浏览了下源码,没做深入研究),于是在兴趣的推动下,花了些时 ...

  2. IOS之未解问题--给UITableView提取UITableViewDataSource并封装瘦身失败

    前言:阅读了<更轻量的 View Controllers>,发现笔者这个优化重构代码的想法真的很不错,可以使得抽取的UITableViewDataSource独立写在一个类文件里,并且也写 ...

  3. 自增build ID配置

    本文转载出自:http://blog.sina.com.cn/s/blog_13ec67adc0102wimg.html   Build在plist文件中的key是“CFBundleVersion”, ...

  4. spring源码分析的书到了

    现在写java后台可以说都能用上spring 在原有的spring基础上,加上自己定制的一些功能,能够使编程变得非常简化. 我也准备在我的毕业设计中写一些spring改造的东西.用来简化开发. 就拿连 ...

  5. 异常处理——毕向东Java基础教程学习笔记

    1.异常:就是程序运行过程中出现的不正常情况. 异常的由来:问题本身也是日常生活中一个具体的事物,也可以通过java类的形式进行描述,并封装成对象.                        其实 ...

  6. 给定a、b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url?

    给定a.b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a.b文件共同的url? 可以估计每个文件的大小为5G*64=300G,远大于4G.所以不可能将其完全加载到 ...

  7. JSON转换类(一)--过滤特殊字符,格式化字符型、日期型、布尔型

    /// <summary> /// 过滤特殊字符 /// </summary> private static string String2Json(String s) { St ...

  8. netty-socketio

    一.简介 netty-socketio是一个开源的Socket.io服务器端的一个java的实现,它基于Netty框架.项目地址为:https://github.com/mrniko/netty-so ...

  9. Swing应用开发实战系列之二:设计日期选择面板窗口

    Swing本身没有提供什么华丽丽的日期时间选择控件,所以笔者就在网上搜了个第三方的jar包jdatepicker-1.3.2.jar,基于此设计了个很轻量的日期选择面板,很简单的.效果图如下所示: 代 ...

  10. jQuery Form 表单提交插件----Form 简介,官方文档,官方下载地址

     一.jQuery Form简介 jQuery Form插件是一个优秀的Ajax表单插件,可以非常容易地.无侵入地升级HTML表单以支持Ajax.jQuery Form有两个核心方法 -- ajaxF ...