2013-02-13 60 views
1

我试图得到年和月的年龄从给定DOB。现在,我的代码如下所示:转换一个十进制数年或数月的SQL * Plus

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),我理解,但我需要到0.6转换成月不知何故。

我想,我这样做转换的方法是不是最有效的,但我一直在寻找一个解决方案小时,但无济于事。我曾见过DATEDIFF,但在尝试使用它时仍会收到无效的标识符错误。

任何想法?

回答

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; 

好运。

+0

谢谢你这么,这么多。我一直在这6小时左右,现在也没有谷歌搜索量产此。 – Anon4567 2013-02-13 20:31:07

+0

我其实已经打开另外一个问题,如果你可以回答它了。 :P我对SQL完全陌生,所以我不得不自学不同的东西。 – Anon4567 2013-02-13 20:33:46

+0

@ Anon4567 - np,很高兴能帮到你!当然,我会看看。 – sgeddes 2013-02-13 20:35:16

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中!尽管如此。