仓酷云

标题: MSSQL编程:T-SQL 2 Tips: 1.盘算恣意两日期之间的... [打印本页]

作者: 灵魂腐蚀    时间: 2015-1-16 22:32
标题: MSSQL编程:T-SQL 2 Tips: 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!
别的按着中国人的习气:周日算作上周的最初一天!
假如是其他言语版本的SQLServer注重选用该言语版本的周几的情势!

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
else@eend
)+1

-casewhendatename(weekday,@b)in(礼拜二,礼拜三,木曜日,礼拜五,礼拜六,日曜日)then1
else0end
as周一个数

,datediff(week
,casewhendatename(weekday,@b)=日曜日then@b-1
else@bend
,casewhendatename(weekday,@e)=日曜日then@e-1
else@eend
)+1

-casewhendatename(weekday,@b)in(礼拜三,木曜日,礼拜五,礼拜六,日曜日)then1
else0end
-casewhendatename(weekday,@e)in(礼拜一)then1
else0end
as周二个数

,datediff(week
,casewhendatename(weekday,@b)=日曜日then@b-1
else@bend
,casewhendatename(weekday,@e)=日曜日then@e-1
else@eend
)+1

-casewhendatename(weekday,@b)in(木曜日,礼拜五,礼拜六,日曜日)then1
else0end
-casewhendatename(weekday,@e)in(礼拜一,礼拜二)then1
else0end
as周三个数

,datediff(week
,casewhendatename(weekday,@b)=日曜日then@b-1
else@bend
,casewhendatename(weekday,@e)=日曜日then@e-1
else@eend
)+1

-casewhendatename(weekday,@b)in(礼拜五,礼拜六,日曜日)then1
else0end
-casewhendatename(weekday,@e)in(礼拜一,礼拜二,礼拜三)then1
else0end
as周四个数

,datediff(week
,casewhendatename(weekday,@b)=日曜日then@b-1
else@bend
,casewhendatename(weekday,@e)=日曜日then@e-1
else@eend
)+1

-casewhendatename(weekday,@b)in(礼拜六,日曜日)then1
else0end
-casewhendatename(weekday,@e)in(礼拜一,礼拜二,礼拜三,木曜日)then1
else0end
as周五个数

,datediff(week
,casewhendatename(weekday,@b)=日曜日then@b-1
else@bend
,casewhendatename(weekday,@e)=日曜日then@e-1
else@eend
)+1

-casewhendatename(weekday,@b)in(日曜日)then1
else0end
-casewhendatename(weekday,@e)in(礼拜一,礼拜二,礼拜三,木曜日,礼拜五)then1
else0end
as周六个数

,datediff(week
,casewhendatename(weekday,@b)=日曜日then@b-1
else@bend
,casewhendatename(weekday,@e)=日曜日then@e-1
else@eend
)+1

-casewhendatename(weekday,@e)in(礼拜一,礼拜二,礼拜三,木曜日,礼拜五,礼拜六)then1
else0end

as周日个数

--哇塞终究弄定了,后来没想到的是:居然实在动了一番头脑!

剩下的就是用的人能够随心所欲地将他酿成UDFSP(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
由MySQL用来存储数据的文件格式以已经被广泛地测试过,但是总是有外部情况可以导致数据库表被破坏:
作者: 金色的骷髅    时间: 2015-1-19 16:23
需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
作者: admin    时间: 2015-1-25 17:34
两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书
作者: 小妖女    时间: 2015-2-3 12:06
原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!
作者: 山那边是海    时间: 2015-2-8 20:53
而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
作者: 因胸联盟    时间: 2015-2-26 10:37
财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
作者: 再现理想    时间: 2015-3-8 13:41
微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数据库的一些概念可以实现了。
作者: 小女巫    时间: 2015-3-16 01:21
所以你总能得到相应的升级版本,来满足你的需求。
作者: 精灵巫婆    时间: 2015-3-22 18:31
对于微软系列的东西除了一遍遍尝试还真没有太好的办法




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2