解决日期差异的问题,并用年月日表示

leizhiyong 2009-11-02 09:41:55
各位大哥
我在SQLSERVER2000里有一个表,字段都为日期型,字段A,字段B(B比A大),现在要求求出 B与A的差异,并说明差异是多少年多少月多少日,例如2009-01-01与2008-12-25差异6天,2009-04-01与2008-07-01差8,9个月吧,求一个存储过程,或者函数,谢谢!
...全文
202 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhongti 2009-11-04
  • 打赏
  • 举报
回复
天:
datediff(day,a,b)

datediff(month,a,b)

datediff(year,a,b)
luoyoumou 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 leizhiyong 的回复:]
就是说,B,A,月份一样,B年份比A大,但B日期比A日期小,这种情况,就出现月份负数,刚才需要重新修改测试
[/Quote]

----楼主:我17楼的,你测试过吗?不是你要的数据吗?
忆轩辕 2009-11-03
  • 打赏
  • 举报
回复
datediff计算出2个日期之间的天数,之后想办法判断当中有几年或者几个月或者几天
leizhiyong 2009-11-03
  • 打赏
  • 举报
回复
就是说,B,A,月份一样,B年份比A大,但B日期比A日期小,这种情况,就出现月份负数,刚才需要重新修改测试
luoyoumou 2009-11-03
  • 打赏
  • 举报
回复
----我又来蹭分!
-----------------------------------------------------------
--不虑日期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;

-------------------------------------------------------------------------------
--考虑日期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;
luoyoumou 2009-11-03
  • 打赏
  • 举报
回复

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)+'日'
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;
忆轩辕 2009-11-03
  • 打赏
  • 举报
回复
天:
datediff(dd,a,b)

datediff(mm,a,b)

datediff(yy,a,b)

如果不能保证输入的2个时间哪个在前哪个在后,先用if判断下不就行了?
leizhiyong 2009-11-03
  • 打赏
  • 举报
回复
既然是-1月,那就没有一年,应该是11月29日
leizhiyong 2009-11-03
  • 打赏
  • 举报
回复
上面的月还是不行啊,例如 a:'2008-07-07',b:'2009-07-06',运行SQL得到1年-1月29日


declare @t table(a datetime,b datetime);
insert @t select '2008-07-01','2009-04-01';

-->查询
select
ltrim(case
when month(a)<=month(b)
then datediff(yy,a,b)
else
datediff(yy,a,b)-1
end)+'年'
+ltrim(case
when day(a)<=day(b)
then datediff(mm,a,b)%12
else
datediff(mm,a,b)%12-1
end)+'月'
+ltrim(case
when day(a)<=day(b)
then day(b)-day(a)
else
datediff(dd,convert(varchar(8),dateadd(mm,-1,b),120)+'01',b)+1-day(a)
end)+'日'
from
@t


leizhiyong 2009-11-03
  • 打赏
  • 举报
回复
上面的月还是不行啊,例如 a:'2008-07-07','2009-07-06'得到1年-1月29日
luoyoumou 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sgtzzc 的回复:]
SQL codedeclare@ttable(adatetime,bdatetime);insert@tselect'2008-07-01','2009-04-01';-->查询selectltrim(casewhenmonth(a)<=month(b)thendatediff(yy,a,b)elsedatediff(yy,a,b)-1end)+'年'+ltrim(casewhenday(a)<=¡­
[/Quote]

----我又来蹭分!

--考虑日期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'
-->查询
select
ltrim(case
when month(a)<=month(b)
then datediff(yy,a,b)
else
datediff(yy,a,b)-1
end)+'年'
+ltrim(case
when day(a)<=day(b)
then datediff(mm,a,b)%12
else
datediff(mm,a,b)%12-1
end)+'月'
+ltrim(case
when day(a)<=day(b)
then day(b)-day(a)
else
datediff(dd,convert(varchar(8),dateadd(mm,-1,b),120)+'01',b)+1-day(a)
end)+'日'
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;
weilei0 2009-11-02
  • 打赏
  • 举报
回复
SELECT A,B,DATEDIFF(DD,A,B) AS 天,DATEDIFF(MM,A,B) AS 月,DATEDIFF(YY,A,B) AS 年 from table
luoyoumou 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sgtzzc 的回复:]
SQL codedeclare@ttable(adatetime,bdatetime);insert@tselect'2008-07-01','2009-04-01';-->查询selectltrim(casewhenmonth(a)<=month(b)thendatediff(yy,a,b)elsedatediff(yy,a,b)-1end)+'年'+ltrim(casewhenday(a)<=¡­
[/Quote]

--字段都为日期型,字段A,字段B(B比A大),

----正解:不需要去考虑日期B比日期A小的情况了!
sgtzzc 2009-11-02
  • 打赏
  • 举报
回复
declare @t table(a datetime,b datetime);
insert @t select '2008-07-01','2009-04-01';

-->查询
select
ltrim(case
when month(a)<=month(b)
then datediff(yy,a,b)
else
datediff(yy,a,b)-1
end)+'年'
+ltrim(case
when day(a)<=day(b)
then datediff(mm,a,b)%12
else
datediff(mm,a,b)%12-1
end)+'月'
+ltrim(case
when day(a)<=day(b)
then day(b)-day(a)
else
datediff(dd,convert(varchar(8),dateadd(mm,-1,b),120)+'01',b)+1-day(a)
end)+'日'
from
@t

/**


------------------------------------------
0年9月0日

(所影响的行数为 1 行)
**/
-狙击手- 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 leizhiyong 的回复:]
可能不行吧,如果按照这个,2008-12-25与2009-01-01,那不就是1年,-11月,-24天了,我先测试一下
[/Quote]


...
luoyoumou 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 leizhiyong 的回复:]
可能不行吧,如果按照这个,2008-12-25与2009-01-01,那不就是1年,-11月,-24天了,我先测试一下
[/Quote]

--- 明白楼主的意思了
leizhiyong 2009-11-02
  • 打赏
  • 举报
回复
可能不行吧,如果按照这个,2008-12-25与2009-01-01,那不就是1年,-11月,-24天了,我先测试一下
htl258_Tony 2009-11-02
  • 打赏
  • 举报
回复
datediff的使用,查看联机帮助.
--小F-- 2009-11-02
  • 打赏
  • 举报
回复
天:
datediff(dd,a,b)

datediff(mm,a,b)

datediff(yy,a,b)
sgtzzc 2009-11-02
  • 打赏
  • 举报
回复
datediff()
加载更多回复(1)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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