T-SQL2Tips:1.计算任意两日期之间的"周一"到"周日"分别各有几个!2.根据出生..
2008-04-27 05:09
429 查看
这两个小技巧,不写不知道,一写吓一跳!
都是看似简单,实际做起来就懵,得仔细想一想,才能写对!
凡是有日期运算的程序都要细心哦!
先说第二个:
2.根据出生日期精确计算年龄!
所谓计算精确年龄就是:生日差一天也不能长一岁!
大家常用,间隔年数算作年龄!如果需求要精确,如:保险之类的,就粗了!
当然还可引申为根据入职日期计算精确的司龄,算加薪之类的需求!
我起初认为很简单,当年也写了好几遍才写对!高手们也被我晃点了数次几近晕倒!
不信有当年2002-11-2716:16:26贴子为证:
《我的表中有字段出生年月日,请问怎样根据当前日期计算该人的年龄,并填充到表的相应字段内?》 http://search.csdn.net/expert/topicview1.asp?id=1210302
书归正传:
declare@Birthdaysmalldatetime
set@Birthday='1949-6-5'
--多用一个日期变量,为了扩展:计算将来或过去某一时刻的当时的精确年龄的功能!
declare@smalldatetime
set@=getdate()
selectdatediff(year,@Birthday,@)
+casewhendateadd(year,datediff(year,@Birthday,@),@Birthday)<=@
then1
else0
end
再说第一个:
1.计算任意两日期之间的周一到周日分别各有几个!
起因来自该贴:
《SQL语句求当月的上班天数》 http://community.csdn.net/Expert/TopicView1.asp?id=3291510
本来想偷懒Google一下,没有满意的结果,好像他自己也没底!思路也不一样!
《求一尖酸的算法》(有点儿同感,说起来简单,做起来就晕) http://www.itpub.net/252645.html
顺便说一下,我写程序总想写的"更通用"一些,可能答非所问了!
由于@@datefirst可通过setdatefirstN设定导致datepart(weekday,[date])不确定!
所以用datename!
因为确定的日期是周几肯定是永远不变的!当然不随datefirst变!
所以更要用datename!
另外按着中国人的习惯:周日算作上周的最后一天!
如果是其他语言版本的注意选用该语言版本的周几的形式!
declare@bdatetime
declare@edatetime
set@b='2004-07-29'
set@e='2004-08-05'
select@bas开始日期,@eas结束日期,
datediff(week
,casewhendatename(weekday,@b)='星期日'then@b-1
else@bend
,casewhendatename(weekday,@e)='星期日'then@e-1
else@eend
)+1as跨周数
,datediff(week
,casewhendatename(weekday,@b)='星期日'then@b-1
else@bend
,casewhendatename(weekday,@e)='星期日'then@e-1共4页 1
都是看似简单,实际做起来就懵,得仔细想一想,才能写对!
凡是有日期运算的程序都要细心哦!
先说第二个:
2.根据出生日期精确计算年龄!
所谓计算精确年龄就是:生日差一天也不能长一岁!
大家常用,间隔年数算作年龄!如果需求要精确,如:保险之类的,就粗了!
当然还可引申为根据入职日期计算精确的司龄,算加薪之类的需求!
我起初认为很简单,当年也写了好几遍才写对!高手们也被我晃点了数次几近晕倒!
不信有当年2002-11-2716:16:26贴子为证:
《我的表中有字段出生年月日,请问怎样根据当前日期计算该人的年龄,并填充到表的相应字段内?》 http://search.csdn.net/expert/topicview1.asp?id=1210302
书归正传:
declare@Birthdaysmalldatetime
set@Birthday='1949-6-5'
--多用一个日期变量,为了扩展:计算将来或过去某一时刻的当时的精确年龄的功能!
declare@smalldatetime
set@=getdate()
selectdatediff(year,@Birthday,@)
+casewhendateadd(year,datediff(year,@Birthday,@),@Birthday)<=@
then1
else0
end
再说第一个:
1.计算任意两日期之间的周一到周日分别各有几个!
起因来自该贴:
《SQL语句求当月的上班天数》 http://community.csdn.net/Expert/TopicView1.asp?id=3291510
本来想偷懒Google一下,没有满意的结果,好像他自己也没底!思路也不一样!
《求一尖酸的算法》(有点儿同感,说起来简单,做起来就晕) http://www.itpub.net/252645.html
顺便说一下,我写程序总想写的"更通用"一些,可能答非所问了!
由于@@datefirst可通过setdatefirstN设定导致datepart(weekday,[date])不确定!
所以用datename!
因为确定的日期是周几肯定是永远不变的!当然不随datefirst变!
所以更要用datename!
另外按着中国人的习惯:周日算作上周的最后一天!
如果是其他语言版本的注意选用该语言版本的周几的形式!
declare@bdatetime
declare@edatetime
set@b='2004-07-29'
set@e='2004-08-05'
select@bas开始日期,@eas结束日期,
datediff(week
,casewhendatename(weekday,@b)='星期日'then@b-1
else@bend
,casewhendatename(weekday,@e)='星期日'then@e-1
else@eend
)+1as跨周数
,datediff(week
,casewhendatename(weekday,@b)='星期日'then@b-1
else@bend
,casewhendatename(weekday,@e)='星期日'then@e-1共4页 1
相关文章推荐
- T-SQL 2 Tips: 1.计算任意两日期之间的"周一"到"周日"分别各有几个! 2.根据出生日期计算精确年龄!
- T-SQL 2 Tips: 1.计算任意两日期之间的"周一"到"周日"分别各有几个! 2.根据出生日期计算精确年龄!
- sql计算任意两日期之间的"周一"到"周日"分别各有几个
- 根据当前传入日期计算该日期所在星期的周一和周日
- Java 根据指定日期计算所在周的周一和周日
- 根据日期计算出周一和周日
- Java 根据指定日期计算所在周的周一和周日
- php根据出生日期计算年龄函数
- C++ 计算任意两个日期之间的天数
- 根据出生日期计算出年龄
- 根据两个日期计算此两日期之间的总天数
- 计算两个日期之间的天数----MySQL&SQL Server解决方案
- 由当前日期计算相应的周一和周日
- java根据出生日期计算年龄
- 由当前日期计算相应的周一和周日
- mysql 根据指定日期取不超过指定日期的周一至周日
- 计算两个任意日期之间的工作日
- 根据指定日期计算所在周一的日期
- 根据用户输入的二代身份证号码自动为其计算生成出生日期的javascript方法
- 根据当前日期获得所在周的日期区间(周一和周日日期),一个月有多少天