国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

T-SQL 2 Tips: 1.計算任意兩日期之間的"周一"到&

2024-07-21 02:07:58
字體:
來源:轉載
供稿:網友

這兩個小技巧,不寫不知道,一寫嚇一跳!
都是看似簡單,實際做起來就懵,得仔細想一想,才能寫對!
凡是有日期運算的程序都要細心哦!

先說第二個:

2.根據出生日期精確計算年齡!
  所謂計算精確年齡就是: 生日差一天也不能長一歲!
  大家常用,間隔年數算作年齡! 如果需求要精確,如: 保險 之類的,就粗了!
  當然還可引申為根據入職日期計算精確的司齡,算加薪之類的需求!
  我起初認為很簡單,當年也寫了好幾遍才寫對!高手們也被我晃點了數次幾近暈倒!
  不信有當年 2002-11-27 16:16:26 貼子為證:

  《我的表中有字段出生年月日,請問怎樣根據當前日期計算該人的年齡,并填充到表的相應字段內?》
   http://search.csdn.net/expert/topicview1.asp?id=1210302

  書歸正傳:

declare @birthday smalldatetime
set @birthday ='1949-6-5'

--多用一個日期變量,為了擴展: 計算將來或過去某一時刻的當時的精確年齡 的功能!
declare @ smalldatetime
set @ = getdate()

select datediff(year,@birthday,@)
       + case when dateadd(year,datediff(year,@birthday,@),@birthday) <= @
                   then 1
              else 0
         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 datetime
declare @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 跨周數

      ,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

- case when datename(weekday,@b) in ('星期二','星期三','星期四','星期五','星期六','星期日') then 1
       else 0 end
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

- case when datename(weekday,@b) in ('星期三','星期四','星期五','星期六','星期日') then 1
       else 0 end
- case when datename(weekday,@e) in ('星期一') then 1
       else 0 end
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

- case when datename(weekday,@b) in ('星期四','星期五','星期六','星期日') then 1
       else 0 end
- case when datename(weekday,@e) in ('星期一','星期二') then 1
       else 0 end
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

- case when datename(weekday,@b) in ('星期五','星期六','星期日') then 1
       else 0 end
- case when datename(weekday,@e) in ('星期一','星期二','星期三') then 1
       else 0 end
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

- case when datename(weekday,@b) in ('星期六','星期日') then 1
       else 0 end
- case when datename(weekday,@e) in ('星期一','星期二','星期三','星期四') then 1
       else 0 end
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

- case when datename(weekday,@b) in ('星期日') then 1
       else 0 end
- case when datename(weekday,@e) in ('星期一','星期二','星期三','星期四','星期五') then 1
       else 0 end
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

- case when datename(weekday,@e) in ('星期一','星期二','星期三','星期四','星期五','星期六') then 1
       else 0 end

as 周日個數

--哇塞終于搞定了,起初沒想到的是: 竟然著實動了一番腦筋!

剩下的就是用的人可以為所欲為地將他變成 udf sp (view) 等了!
如果你真正理解了我的思路,就可以用任何一種語言實現!

最后再作一下廣告:
http://www.microshaoft.com
http://www.csdn.net/develop/list_article.asp?author=playyuer

送你幾個巨長的 sql,也許狠有用,點一下,幫我加點兒人氣:

t-sql 生成 兩個新的真正的公歷年歷
http://www.csdn.net/develop/read_article.asp?id=26447


t-sql 生成一個簡易的 公歷年歷 t-sql 含日期所在月及年的周次
http://www.csdn.net/develop/read_article.asp?id=26083


http://www.microshaoft.com
http://www.csdn.net/develop/list_article.asp?author=playyuer

商業源碼熱門下載www.html.org.cn

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沙雅县| 西城区| 西乌珠穆沁旗| 宝山区| 商都县| 日土县| 介休市| 和平区| 彰武县| 石河子市| 东光县| 广水市| 遵义县| 石渠县| 巴塘县| 体育| 晋宁县| 荆州市| 长春市| 曲周县| 海兴县| 南澳县| 双江| 东平县| 宾阳县| 曲周县| 崇左市| 贡山| 胶南市| 衡水市| 安义县| 右玉县| 文水县| 安远县| 宁乡县| 金平| 苏尼特左旗| 诸城市| 北川| 湖州市| 都匀市|