A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 摄影勾魂 中级黑马   /  2013-12-20 23:08  /  1512 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 摄影勾魂 于 2013-12-21 23:28 编辑

问一个关于数据库的问题,在做一个练习的时候突然想到的,但一直没找到解决的办法,特来求救,各位大神费心了。发现问题却久久不能解决的感觉实在是太煎熬了。我用的是Oracle11g。好了,直接说问题:给定任意两个日期,我想得到它们之间的差 ,要用x年y月z天(相当于从第一个日期起,过了x年y月z天就到了第二个日期的时间)来表示,精度是天。比如现在有这样两个日期 2010-10-2、2013-12-19,我想要的结果是3年2个月17天。数据库里面的日期函数只能算间隔的天数或者月数,得到间隔的月数,可以得到年(一年12个月是固定的),这个是没有问题的,关键是后面的天差(不同的月份天数是不同的)怎么解决?如果是2010-10-19----2013-12-2 呢?如果SQL有选择结构这就不是个问题了,也许是我还没学到,我希望通过简单函数和查询语句解决这个问题。 因为日历都是万年历,我想着我这个问题应该有解决的办法吧。或者有谁能把证明我这个想法是错误的也行,我就是想要个结果。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

6 个回复

倒序浏览
lyn 中级黑马 2013-12-20 23:30:09
沙发
顶了,只学过sql server的,
回复 使用道具 举报
select to_date('20131209','yyyy-mm-dd')-to_date('20101019','yyyy-mm-dd') dt from dual
试试
回复 使用道具 举报
小骗子 发表于 2013-12-21 09:33
select to_date('20131209','yyyy-mm-dd')-to_date('20101019','yyyy-mm-dd') dt from dual
试试

你这样写法得到的是相差的天数,我是想把天数转化为年月日的形式,而且不能笼统的按每月30天计算,必须和两个日期间的实际时间相关
回复 使用道具 举报
本帖最后由 摄影勾魂 于 2013-12-21 20:16 编辑
摄影勾魂 发表于 2013-12-21 20:03
你这样写法得到的是相差的天数,我是想把天数转化为年月日的形式,而且不能笼统的按每月30天计算,必须和 ...

年的处理是不存在问题的,主要是日。如果后一个日期的月和日都比前一个日期的大,可以获取对应的月和日再相减,就能得到结果;可是如果后一个日期的日比前一个日期的小,就得先求出后一个日期的前一个月的天数(可以使用last_day),减去前一个日期的日,再加上后一个日期的日,就是所求日级上的值了。这样以来不就存在两种情况了嘛,要比较两个日期的日,然后做不同的处理,类似于需要 if-else结构……,不知道在数据库中怎么实现。
回复 使用道具 举报
摄影勾魂 发表于 2013-12-21 20:03
你这样写法得到的是相差的天数,我是想把天数转化为年月日的形式,而且不能笼统的按每月30天计算,必须和 ...

我找到条件表达式了
  1. case [<表达式>]
  2. when <表达式条件值1> then <满足条件时返回值1>
  3. [when <表达式条件值2> then <满足条件时返回值2>
  4. ……
  5. [else  <不满足上述条件时返回值>]]
  6. end
复制代码
,我想这个应该能解决问题。
回复 使用道具 举报
本帖最后由 摄影勾魂 于 2013-12-21 23:27 编辑

现在基本上算了找到了想要的结果,虽然不是很完善。

  1. SELECT TO_CHAR(dt.date1,'yyyy-mm-dd') 起,TO_CHAR(dt.date2,'yyyy-mm-dd') 止, ' 隔了 ' 间隔,
  2.        FLOOR(b.yue/12) 年,
  3.        FLOOR(MOD(b.yue,12)) 月,
  4.        CASE
  5.           WHEN (to_char(dt.date2,'dd')-to_char(dt.date1,'dd'))>=0  THEN to_char(dt.date2,'dd')-to_char(dt.date1,'dd')
  6.           ELSE to_char(last_day(add_months(dt.date2,-1)),'dd')-to_char(dt.date1,'dd')+to_char(dt.date2,'dd')
  7.        END 天
  8. FROM dateTable dt,(SELECT dno,MONTHS_BETWEEN(date2,date1) as yue FROM dateTable) b
  9. WHERE dt.dno = b.dno
  10. /
复制代码









回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马