首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 如何返回两个日期相差多少年月日 [已结贴,结贴人:zzxap]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzxap
    • 等级:
    发表于:2008-06-25 15:00:21 楼主
      日期1          日期2
    2006-02-03  2008-01-02
    2006-06-08  2004-03-05
    2007-05-06  2008-06-07


    如何计算这两个日期相差多少年多少月多少天??

    日期1          日期2            相差
    2006-02-03  2008-01-02    x年x月x日
    2006-06-08  2004-03-05    x年x月x日
    2007-05-06  2008-06-07    x年x月x日
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 15:03:521楼 得分:5
    要精确值还是按365天一年,30天一月算?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 15:05:422楼 得分:5
    SQL code
    declare @sdt datetime,@edt datetime set @sdt='2006-02-03' set @edt='2008-01-02' select ltrim(datediff(dd,@sdt,@edt)/365)+''+ltrim(datediff(dd,@sdt,@edt)%365/30)+''+ltrim(datediff(dd,@sdt,@edt)%365%30)+''


    1年11月3天
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 15:09:243楼 得分:0
    SQL code
    create table tb(日期1 datetime,日期2 datetime) insert into tb select '2006-02-03','2008-01-02' insert into tb select '2006-06-08','2004-03-05' insert into tb select '2007-05-06','2008-06-07' select *,ltrim(datediff(dd,日期1,日期2)/365)+''+ltrim(datediff(dd,日期1,日期2)%365/30)+''+ltrim(datediff(dd,日期1,日期2)%365%30)+'' as 间隔 from tb


    日期1 日期2 间隔
    2006-02-03 00:00:00.000 2008-01-02 00:00:00.000 1年11月3天
    2006-06-08 00:00:00.000 2004-03-05 00:00:00.000 -2年-3月-5天
    2007-05-06 00:00:00.000 2008-06-07 00:00:00.000 1年1月3天
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 15:10:234楼 得分:5
    是这样吗?
    SQL code
    declare @tb table (d1 datetime,d2 datetime) insert into @tb select '2006-02-03','2008-01-02' union all select '2006-06-08','2004-03-05' union all select '2007-05-06','2008-06-07' select d1,d2,cast(datediff(yy,d1,d2) as varchar)+''+cast(datediff(mm,d1,d2)/12 as varchar)+''+cast(datediff(dd,d1,d2)/12/30 as varchar)+'' from @tb
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 15:14:425楼 得分:5
    datediff(d,@sdt,@edt)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kldxdybb
    • 等级:
    发表于:2008-06-25 15:17:286楼 得分:5
    闰年怎么算????
    一月算28天29天.30天.31天???
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 15:17:557楼 得分:5
    DATEDIFF ( datepart , startdate , enddate )
    startdate 是从 enddate 减去。如果 startdate 比 enddate 晚,返回负值。

    当结果超出整数值范围,DATEDIFF 产生错误。对于毫秒,最大数是 24 天 20 小时 31 分钟零 23.647 秒。对于秒,最大数是 68 年。

    计算跨分钟、秒和毫秒这些边界的方法,使得 DATEDIFF 给出的结果在全部数据类型中是一致的。结果是带正负号的整数值,其等于跨第一个和第二个日期间的 datepart 边界数。例如,在 1 月 4 日(星期日)和 1 月 11 日(星期日)之间的星期数是 1。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-25 15:20:108楼 得分:0
    这东西有两种理解,一种是按2楼,一年按365天算,一月按30天算
    还有就是按日期算,比如:2002-5-1到2008-5-1是6年0月0天。要按第一种算法,就是6年0月2天.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • only_endure
    • 等级:
    发表于:2008-06-25 15:25:289楼 得分:0
    没必要那么精确吧,如果精确那要在网上找了。
    datediff(d,@sdt,@edt)是最精确的,可是楼主不一定想要。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzxap
    • 等级:
    发表于:2008-06-25 16:14:4610楼 得分:0
    还有就是按日期算,比如:2002-5-1到2008-5-1是6年0月0天
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zzxap
    • 等级:
    发表于:2008-07-01 09:00:4611楼 得分:0
    都不是我想要的。我想,如果月份不够相减,就向年份借12个月去相减,,,,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 09:09:0812楼 得分:0
    引用 11 楼 zzxap 的回复:
    都不是我想要的。我想,如果月份不够相减,就向年份借12个月去相减,,,,

    那你datepart和datediff相结合不就得了,8楼说的就包括你的想法了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 09:22:4313楼 得分:10
    SQL code
    --try: --创建函数 create function f_wsp(@star datetime,@end datetime) returns varchar(20) as begin declare @star1 varchar(10),@end1 varchar(10) declare @cha varchar(20) set @cha='' if(@star>=@end) set @cha='开始日期大于等于结束日期' else begin set @star1=stuff(convert(varchar(10),@star,120),1,4,'1990') set @end1=stuff(convert(varchar(10),@end,120),1,4,'1990') if(datediff(dd,@star1,@end1)>0) begin set @cha=ltrim(datediff(yy,@star,@end))+'' set @star=stuff(convert(varchar(10),@star,120),1,4,datename(yy,@end)) end else begin set @cha=ltrim(datediff(yy,@star,@end)-1)+'' set @star=stuff(convert(varchar(10),@star,120),1,4,ltrim(datepart(yy,@end)-1)) end set @star1=stuff(convert(varchar(10),@star,120),1,7,'1990-01') set @end1=stuff(convert(varchar(10),@end,120),1,7,'1990-01') if(datediff(dd,@star1,@end1)>0) begin set @cha=@cha+ltrim(datediff(mm,@star,@end))+'' set @star=stuff(convert(varchar(10),@star,120),1,7,convert(varchar(7),@end,120)) end else begin set @cha=@cha+ltrim(datediff(mm,@star,@end)-1)+'' set @star=stuff(convert(varchar(10),@star,120),1,7,convert(varchar(7),dateadd(mm,-1,@end),120)) end set @cha=@cha+ltrim(datediff(dd,@star,@end))+'' end return @cha end go --调用函数: --> 测试数据: @s declare @s table (日期1 datetime,日期2 datetime) insert into @s select '2006-02-03','2008-01-02' union all select '2006-06-08','2004-03-05' union all select '2007-05-06','2008-06-07' select 日期1,日期2,dbo.f_wsp(日期1,日期2) from @s
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 09:39:3314楼 得分:10
    SQL code
    create table tb(日期1 datetime,日期2 datetime) insert into tb select '2006-02-03','2008-01-02' insert into tb select '2006-06-08','2004-03-05' insert into tb select '2007-05-06','2008-06-07' select 相差=Convert(nvarchar,case when datepart(mm,日期2)>datepart(mm,日期1) or datepart(mm,日期2)=datepart(mm,日期1)and datepart(dd,日期2)>=datepart(dd,日期1) then datepart(yy,日期2)-datepart(yy,日期1) else datepart(yy,日期2)-datepart(yy,日期1)-1 end)+''+ convert(nvarchar,datediff(mm,日期1,日期2)%12)+''+Cast(datediff(dd,日期1,日期2)%365%30 as nvarchar)+'' from tb
    相差                                                                                             
    ------------------------------------------------------------------------------------------------
    1年11月3日
    -3年-3月-5日
    1年1月3日

    (所影响的行数为 3 行)
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved