RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:9:30-18:00
你可能遇到了下面的问题
关闭右侧工具栏
T-SQL 2 Tips: 1.计算任意两日期之间的"周一&qu
  • 作者:zhaozj
  • 发表时间:2020-12-23 11:00
  • 来源:未知

这两个小技巧,不写不知道,一写吓一跳!都是看似简单,实际做起来就懵,得仔细想一想,才能写对!凡是有日期运算的程序都要细心哦!

先说第二个:

2.根据出生日期精确计算年龄!  所谓计算精确年龄就是: 生日差一天也不能长一岁!  大家常用,间隔年数算作年龄! 如果需求要精确,如: 保险 之类的,就粗了!  当然还可引申为根据入职日期计算精确的司龄,算加薪之类的需求!  我起初认为很简单,当年也写了好几遍才写对!高手们也被我晃点了数次几近晕倒!  不信有当年 2002-11-27 16:16:26 贴子为证:

  《我的表中有字段出生年月日,请问怎样根据当前日期计算该人的年龄,并填充到表的相应字段内?》   http://search.csdn.net/expert/topicview1.asp?id=1210302

  书归正传:

declare @Birthday smalldatetimeset @Birthday ='1949-10-01'

--多用一个日期变量,为了扩展: 计算将来或过去某一时刻的当时的精确年龄 的功能!declare @ smalldatetimeset @ = getdate()

select datediff(year,@Birthday,getdate())       - case when datediff(day,dateadd(year,datediff(year,@Birthday,getdate()),@Birthday),getdate()) >= 0                   then 0               else 1         end

T-SQL UDF:create function GetAge(@BeginDate datetime,@EndDate datetime)returns integerbeginreturn (select datediff(year,@BeginDate,@EndDate) - case when datediff(day,dateadd(year,datediff(year,@BeginDate,@EndDate),@BeginDate),@EndDate) >= 0 then 0 else 1 end)end

再说第一个:1.计算任意两日期之间的 周一 到 周日 分别各有几个!   起因来自该贴:  《SQL语句求当月的上班天数》   http://community.csdn.net/Expert/TopicView1.asp?id=3291510

   本来想偷懒 Google 一下,没有满意的结果,好像他自己也没底!思路也不一样!  《求一尖酸的算法》(有点儿同感,说起来简单,做起来就晕)   http://www.itpub.net/252645.html

   顺便说一下,我写程序总想写的"更通用"一些,可能答非所问了!

由于 @@datefirst 可通过 set datefirst N 设定 导致 datepart(weekday,[date]) 不确定!所以用 datename!因为确定的日期是周几肯定是永远不变的!当然不随 datefirst 变!所以更要用 datename!另外按着中国人的习惯: 周日算作上周的最后一天!如果是其他语言版本的 SQL Server 注意选用该语言版本的 周几 的形式!

declare @b datetimedeclare @e datetime

set @b = '2004-07-29'set @e = '2004-08-05'

select @b as 开始日期,@e as 结束日期,datediff(week         ,case when datename(weekday,@b) = '星期日' then @b - 1               else @b end         ,case when datename(weekday,@e) = '星期日' then @e - 1               else @e end        ) + 1 as 跨周数