---再求更好的方法:求两个日期相差 xx年xx月xx日---

luoyoumou 2009-11-03 06:44:04
------原帖网址:
http://topic.csdn.net/u/20091102/21/77ce7c4e-db0b-47bf-b090-f5f0397d048e.html



--1。不考虑日期B比日期A小的情况(日期B一定大于日期A)
declare @t table(a datetime,b datetime);
insert @t
select
'2008-07-01','2009-04-01' union all select
'2006-04-08','2009-07-11' union all select
'2008-07-07','2009-07-06'
-->查询
select a,b,
ltrim(case
when (month(b)=month(a) and day(b)>=day(a)) or month(b)>month(a)
then datediff(year,a,b)
else
datediff(year,a,b)-1
end)+'年'
+ltrim(case
when day(b)>=day(a) --and month(b)>=month(a)
then datediff(month,a,b)%12
else
(datediff(month,a,b)-1)%12
end)+'月'
+ltrim(case
when day(b)>=day(a)
then day(b)-day(a)
else
datediff(dd,convert(varchar(8),dateadd(mm,-1,b),120)+'01',b)+1-day(a)
end)+'日' as '日期差'
from @t t;

-------------------------------------------------------------------------------
--2。考虑日期B比日期A小的情况

declare @t table(a datetime,b datetime);
insert @t
select
'2008-07-01','2009-04-01' union all select
'2009-07-11','2006-04-08' union all select
'2008-07-07','2009-07-06'
-->查询
select a,b,
ltrim(case
when (month(b)=month(a) and day(b)>=day(a)) or month(b)>month(a)
then datediff(year,a,b)
else
datediff(year,a,b)-1
end)+'年'
+ltrim(case
when day(b)>=day(a) --and month(b)>=month(a)
then datediff(month,a,b)%12
else
(datediff(month,a,b)-1)%12
end)+'月'
+ltrim(case
when day(b)>=day(a)
then day(b)-day(a)
else
datediff(dd,convert(varchar(8),dateadd(mm,-1,b),120)+'01',b)+1-day(a)
end)+'日' as '日期差'
from
(select (case when a>b then b else a end) as a,
(case when a>b then a else b end) as b from @t ) t;



------不知道各位大侠有没有更好的方法,我这个也许是最笨的方法。哎:总感觉太麻烦了!
...全文
287 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
fwacky 2009-11-04
  • 打赏
  • 举报
回复
呵呵,需求不明!
忆轩辕 2009-11-04
  • 打赏
  • 举报
回复

declare @yy int,@mm int,@dd int,@date_a varchar(15),@date_b varchar(15)

select @date_a = '2009-03-01',@date_b='2008-03-01'

if cast(@date_a as datetime)<=cast(@date_b as datetime)
begin
set @yy=datediff(yy,@date_a,@date_b)-1
if @yy<=0
begin
set @yy=0
end
select @mm=datediff(mm,dateadd(yy,@yy,@date_a),@date_b)-1
if @mm<=0
begin
set @mm=0
end
select @dd=datediff(dd,dateadd(mm,@mm,@date_a),@date_b)
if @dd<=0
begin
set @dd=0
end
if @dd>=(datediff(dd,dateadd(mm,-1,convert(char(8),@date_b,120)+'1'),dateadd(dd,-1,convert(char(8),@date_b,120)+'1'))+1)
begin
select @dd=@dd-(datediff(dd,dateadd(mm,-1,convert(char(8),@date_b,120)+'1'),dateadd(dd,-1,convert(char(8),@date_b,120)+'1'))+1),@mm=@mm+1
end
if @mm>=12
begin
select @yy=@yy+1,@mm=@mm-12
end
end
else
begin
set @yy=datediff(yy,@date_b,@date_a)-1
if @yy<=0
begin
set @yy=0
end
select @mm=datediff(mm,dateadd(yy,@yy,@date_b),@date_a)-1
if @mm<=0
begin
set @mm=0
end
select @dd=datediff(dd,dateadd(mm,@mm,@date_b),@date_a)
if @dd<=0
begin
set @dd=0
end
if @dd>=(datediff(dd,dateadd(mm,-1,convert(char(8),@date_a,120)+'1'),dateadd(dd,-1,convert(char(8),@date_a,120)+'1'))+1)
begin
select @dd=@dd-(datediff(dd,dateadd(mm,-1,convert(char(8),@date_a,120)+'1'),dateadd(dd,-1,convert(char(8),@date_a,120)+'1'))+1),@mm=@mm+1
end
if @mm>=12
begin
select @yy=@yy+1,@mm=@mm-12
end
end


select @yy as 年,@mm as 月,@dd as 日


感觉思路有点乱了,暂且就这样发上来,仅供参考=。=
WizardOz 2009-11-04
  • 打赏
  • 举报
回复
这些东西干嘛要用SQL来写?
showjim 2009-11-04
  • 打赏
  • 举报
回复
select cast((datediff(month,@s,@e)-(case when day(@s)>day(@e)then 1 else 0 end))/12 as varchar)+'年'
+cast((datediff(month,@s,@e)-(case when day(@s)>day(@e)then 1 else 0 end))%12 as varchar)+'月'
+cast(datediff(day,dateadd(month,datediff(month,@s,@e)-(case when day(@s)>day(@e)then 1 else 0 end),@s),@e)as varchar)+'日'
W84456393 2009-11-04
  • 打赏
  • 举报
回复
先讲所要求得排列成一个行列矩阵,不是想日历那种有月份隔开,而是连续的,有点像制表。貌似是数据结构里的一个问题,原来做过。
-狙击手- 2009-11-03
  • 打赏
  • 举报
回复
case when dateadd(yy,1,a) > b then ...
else ...
end

不要那样组合判断了
  • 打赏
  • 举报
回复
挺好了,别等了
navy887 2009-11-03
  • 打赏
  • 举报
回复
..
华夏小卒 2009-11-03
  • 打赏
  • 举报
回复
.
子陌红尘 2009-11-03
  • 打赏
  • 举报
回复
.
luoyoumou 2009-11-03
  • 打赏
  • 举报
回复
自己再顶一下:这是第三根烟了,继续坐等高人出现
--小F-- 2009-11-03
  • 打赏
  • 举报
回复
学习
liangCK 2009-11-03
  • 打赏
  • 举报
回复
.Net用DateTime.op_Subtraction()得到TimeSpan就完事了.
luoyoumou 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 guguda2008 的回复:]
感觉这题用计算列应该好解决
[/Quote]

--整整看:鸭子,先谢了!
guguda2008 2009-11-03
  • 打赏
  • 举报
回复
感觉这题用计算列应该好解决
guguda2008 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 feixianxxx 的回复:]
引用 11 楼 guguda2008 的回复:
思路差不多,也是用DATEDIFF查出各自的部分再根据具体情况作调整最后拼成字符串输出,似乎没有什么更好的方法

鸭子 这个需求没有一定规则不行的
比如说 它相差几年 你总要知道这个一年是几天的吧?
[/Quote]
我明白你的意思,要考虑闰年,比如2008-2-1到2009-2-1差366天,是算一年还是算一年零一天,这个自己定一个就行了吧。如果只按365天算那就算出天数然后分别对365、12取余处理一下就行了,如果要考虑的话就算出差几个闰年再减掉相应的天数就好
feixianxxx 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 guguda2008 的回复:]
引用 12 楼 feixianxxx 的回复:
引用 11 楼 guguda2008 的回复:
思路差不多,也是用DATEDIFF查出各自的部分再根据具体情况作调整最后拼成字符串输出,似乎没有什么更好的方法

鸭子 这个需求没有一定规则不行的
比如说 它相差几年 你总要知道这个一年是几天的吧?

有开始日期和结束日期能算出来吧,比如2006和2009年之间2008年是366天,其它都是365天,写写看看吧,应该是能算出来
[/Quote]
有这种说法?
guguda2008 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 feixianxxx 的回复:]
引用 11 楼 guguda2008 的回复:
思路差不多,也是用DATEDIFF查出各自的部分再根据具体情况作调整最后拼成字符串输出,似乎没有什么更好的方法

鸭子 这个需求没有一定规则不行的
比如说 它相差几年 你总要知道这个一年是几天的吧?
[/Quote]
有开始日期和结束日期能算出来吧,比如2006和2009年之间2008年是366天,其它都是365天,写写看看吧,应该是能算出来
feixianxxx 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 guguda2008 的回复:]
思路差不多,也是用DATEDIFF查出各自的部分再根据具体情况作调整最后拼成字符串输出,似乎没有什么更好的方法
[/Quote]
鸭子 这个需求没有一定规则不行的
比如说 它相差几年 你总要知道这个一年是几天的吧?
guguda2008 2009-11-03
  • 打赏
  • 举报
回复
思路差不多,也是用DATEDIFF查出各自的部分再根据具体情况作调整最后拼成字符串输出,似乎没有什么更好的方法
加载更多回复(10)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧