每日一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') 月:在当前日期上加两个月 , , 年:在当前日期上加两年 ...
随机推荐
- Java学习总结:飘逸的字符串
Java学习:飘逸的字符串 前言 相信不管我们运用Java语言来开发项目还是进行数据分析处理,都要运用到和字符串相关的处理方法.这个社会处处有着和字符串相关的影子:日志.文档.书籍等.既然我们离不开字 ...
- REDIS 在电商中的实际应用场景(转)
1. 各种计数,商品维度计数和用户维度计数 说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc),Redis的命令都是原子性的,你可以轻松地利用INCR,DECR等 ...
- 迅为iTOP-4418开发板兼容八核6818开发板介绍
核心板介绍 三星四核S5P4418与八核6818完美兼容 1GB内存/2GB内存可选 电源管理:AXP228,支持动态调频,超低功耗 核心板引出脚最全:四组连接器共320个PIN脚 核心板连接器高度仅 ...
- django模型
用django时,只要用到数据库就得用到模型. 一.数据库的MTV开发模式 从MVC到MTV 所谓软件架构的MVC模式将数据的存取逻辑(Module),表现逻辑(View)和业务逻辑(Controll ...
- [转]How to insert a row between two rows in an existing excel with HSSF (Apache POI)
本文转自:http://stackoverflow.com/questions/5785724/how-to-insert-a-row-between-two-rows-in-an-existing- ...
- [麦先生]LINUX常用命令总结
在系统的学习了如何搭建和利用LINUX进行开发后,我利用xMind这一个强大的bug级软件制作了LINUX常见操作命令汇总,但是由于博客园并不支持xMind格式文件的上传,我只能将其做成图片进行分解上 ...
- 用Java实现单链表的基本操作
笔试题中经常遇到单链表的考题,下面用java总结一下单链表的基本操作,包括添加删除节点,以及链表转置. package mars; //单链表添加,删除节点 public class ListNode ...
- 【软件使用】用IntelliJ IDEA开发Android程序图解
博主这里使用的最新的14.0.3版本,下载地址:http://www.jetbrains.com/idea/, 下载后直接安装就可以了. 环境: OS:Win 8 IDE:IntelliJ IDEA ...
- js/jquery判断浏览器的方法总结
JS获取浏览器信息浏览器代码名称:navigator.appCodeName浏览器名称:navigator.appName浏览器版本号:navigator.appVersion对Java的支持:nav ...
- 新手须知 C、C++和VC++之间的区别
本文目地 本文介绍的是C.C++.VC++ 三者之间的区别,也许作为初学者来说,会很容易混淆.希望通过本文的介绍,能够给你带来帮助. C语言 C语言是一种古老而又经久不衰的计算机程序设计语言,大约诞生 ...