将十进制数转换为年和月SQL * Plus

时间:2013-02-13 20:06:18

标签: sql oracle sqlplus

我试图从给定的DOB中获得数年和数月的年龄。现在,我的代码看起来像这样:

COLUMN name FORMAT A25
SELECT sNo, fName||CHR(13)||lName Name, sex, TRUNC((CURRENT_DATE - dob) / 365.24, 1) Age
FROM Staff
WHERE position IN ('Manager', 'Secretary')
ORDER BY age DESC;

它给了我十进制数的年龄输出(例如58.6)我理解,但我需要将.6转换成一个月的某种方式。

我在想我做这种转换的方法效率不高,但我一直在寻找解决方案的时间,但无济于事。我见过DATEDIFF,但在尝试使用它时,我一直收到无效的标识错误。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这样的事情怎么样:

SELECT sNo, fName||CHR(13)||lName Name, sex, 
  TRUNC((CURRENT_DATE - dob) / 365.24, 1) Age,
  TRUNC(MONTHS_BETWEEN(CURRENT_DATE, dob) / 12) YEARS,
  MOD(TRUNC(MONTHS_BETWEEN(CURRENT_DATE, dob)), 12) MONTHS
FROM Staff
WHERE position IN ('Manager', 'Secretary')
ORDER BY age DESC;

这是SQL Fiddle

这也应该让你了解日期:http://sqlfiddle.com/#!4/f3a57/4

SELECT sNo, fName||CHR(13)||lName Name, sex, 
  TRUNC((CURRENT_DATE - dob) / 365.24, 1) Age,
  TRUNC (MONTHS_BETWEEN (CURRENT_DATE, dob) / 12) YEARS,
  MOD (TRUNC (MONTHS_BETWEEN (CURRENT_DATE, dob)), 12) MONTHS,
  TO_DATE (CURRENT_DATE) - 
      ADD_MONTHS (dob,TRUNC (MONTHS_BETWEEN (CURRENT_DATE, dob))) DAYS
FROM Staff
WHERE position IN ('Manager', 'Secretary')
ORDER BY age DESC;
祝你好运。

答案 1 :(得分:0)

SELECT sNo, fName||CHR(13)||lName Name, sex, 
 DATEDIFF(year, dob, Current_Date) - 1 + ' years & ' + dbo.FullMonthSeperation(CURRENT_DATE, dob) + ' months.' AS 'Age'
FROM Staff
WHERE position IN ('Manager', 'Secretary')
ORDER BY age DESC;

我从Calculating number of full months between two dates in SQL借用了这个函数,因为你必须根据一年中的时间考虑负值和正值......我相信还有一个更好的方法来做这几个月,一年应该是最佳的。

希望这适用于SQL Plus!同样的概念。