每日一SQL-善用DATEADD和DATEDIFF
转自: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-善用DATEADD和DATEDIFF的更多相关文章
- DATEADD和DATEDIFF函数、其他日期处理方法 、已打开的端口、FORMAT函数
DATEADD和DATEDIFF函数.其他日期处理方法 .已打开的端口.FORMAT函数 DATEADD和DATEDIFF函数.其他日期处理方法 .已打开的端口.Format函数 KeyLife富翁笔 ...
- DATEADD(Day, DATEDIFF(Day,0,ShippingTime), 0)
select DATEADD(Day, DATEDIFF(Day,0,GETDATE()), 0),DATEDIFF(Day,0,GETDATE()),GETDATE() 结果: (无列名) (无列名 ...
- SQL Server DATEADD() 函数 一步步使用教程
SQL Server DATEADD() 函数 DATEADD() 函数在日期中添加或减去指定的时间间隔. DATEADD(datepart,number,date)date 参数是合法的日期表达式. ...
- DATEADD和DATEDIFF
DateAdd函数 返回 返回包含一个日期的 Variant (Date),这一日期还加上了一段时间间隔. 语法 DateAdd(interval, number, date) DateAdd 函数语 ...
- SQL Server DATEADD() 函数
SQL Server Date 函数 定义和用法 DATEADD() 函数在日期中添加或减去指定的时间间隔. 语法 DATEADD(datepart,number,date) date 参数是合法的日 ...
- sql server dateadd()
定义和用法 DATEADD() 函数在日期中添加或减去指定的时间间隔. 语法 DATEADD(datepart,number,date) date 参数是合法的日期表达式.number 是您希望添加的 ...
- sql server 日期处理datediff
语法: DATEDIFF(datepart,startdate,enddate) datepart 参数可以是下列的值: date-part : year | quarter | month | we ...
- sql 函数 DATEADD 使用
DATEADD ( datepart , number, date ) 在日期中添加或减去指定的时间间隔. datepart 是规定应向日期的哪一部分返回新值的参数. number 为要增加或减去 ...
- Sql server DATEADD日期函数的使用
DATEADD日期函数 DATEADD() 函数在日期中添加或减去指定的时间间隔. 日:在当前日期上加两天 , ,'2014-12-30') 月:在当前日期上加两个月 , , 年:在当前日期上加两年 ...
随机推荐
- 嵌入式调试器原理和各类调试器集锦(JLINK、STLINK、CCDEBUG)
工欲善其事,必先善其器.调试器在嵌入式开发调试中的重要性不言而喻,单步.断点和监察的效率远高于串口打印.但是,调试器对于一般开发人员往往是一个黑匣子.今天我们就来谈谈调试器的原理,顺便把自己的几类调试 ...
- OC中NSArray
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...
- 【iOS开发】UIWebView与JavaScript(JS) 回调交互
------------------------------------------------- 很多关于objc 与 js 交互的文章都比较适用于 mac开发,iOS的webview 还是有所不一 ...
- 函数return/获取元素样式/封装自己的库
一:函数return <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type&qu ...
- Effective Java 11 Override clone judiciously
Principles If you override the clone method in a nonfinal class, you should return an object obtaine ...
- Effective Java 18 Prefer interfaces to abstract classes
Feature Interface Abstract class Defining a type that permits multiple implementations Y Y Permitted ...
- mongo学习笔记(五):分片
分片 人脸: 代表客户端,客户端肯定说,你数据库分片不分片跟我没关系,我叫你干啥就干啥,没什么好商量的. mongos: 首先我们要了解”片键“的概念,也就是说拆分集合的依据是什么?按照 ...
- SQL Server 2008 R2——VC++ ADO 操作 多线程操作 代码结构
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- spring提供的解决中文乱码方案
在表单提交时,如果遇到中文符号会出现乱码问题. Spring提供一个CharacterEncodingFilter过滤器,可用于解决乱码问题. CharacterEncodingFilter使用的时候 ...
- 系统调用wait、waitpid和exec函数
本文介绍了Linux下的进程的一些概念,并着重讲解了与Linux进程管理相关的重要系统调用wait,waitpid和exec函数族,辅助一些例程说明了它们的特点和使用方法. 1.7 背景 在前面的文章 ...