PLSQL - 圆形日期到最近的世纪?

时间:2016-01-27 20:37:00

标签: sql oracle plsql

以下是我想要的输出:

Number of slashes: 2
In 25 days it is: 19-FEB-15
The raw number is:
1.666666667E-01
The rounded number is: .17
Nearest Century: 01-JAN-01

我真的不确定如何将“dDate25”舍入到最近的世纪?

这是我到目前为止的代码:

SET SERVEROUTPUT ON

DECLARE
vFilePath VARCHAR2 (100) := 'c\Temp\ProcDB.mdf';
vFilePath1 VARCHAR2 (100);
nNumber16 FLOAT;
dDate25 DATE := SYSDATE+25;
BEGIN
vFilePath1 := REPLACE (vFILEPATH, '\');
DBMS_OUTPUT.PUT_LINE('Number of slashes:' || (LENGTH(vFilePath)-LENGTH(vFilePath1)));
DBMS_OUTPUT.PUT_LINE('In 25 days it is:' || to_char(dDate25, 'MM-DD-YYYY'));
nNumber16 := 1/6;
DBMS_OUTPUT.PUT_LINE('The raw number is: ' || to_char(nNumber16, '9.999999999EEEE'));
DBMS_OUTPUT.PUT_LINE('The rounded number is: ' || round(nNumber16, 2));

END;

谢谢,

3 个答案:

答案 0 :(得分:1)

如果你想要“向下舍入”到当前世纪,你可以使用the TRUNC(date) function(所以2051年的日期给了2001年);或者the ROUND(date) function如果你想要正确地舍入(所以2051给出了2101)。无论哪种方式,使用CC格式掩码来获得本世纪的第一天:

SQL> select round(sysdate + 25, 'CC') from dual;

TRUNC(SYSDATE+25,'C
-------------------
2001-01-01 00:00:00

所以你可以使用:

ROUND(dDate25)

然后你可以根据需要格式化;没有任何NLS假设:

DBMS_OUTPUT.PUT_LINE('Nearest Century: '
  || TO_CHAR(ROUND(dDate25, 'CC'), 'DD-MON-RR', 'NLS_DATE_LANGUAGE=ENGLISH'));

答案 1 :(得分:0)

你的意思是十年而不是世纪,对吗?否则你的两个结束数字将永远是" 01" : - )

更正版本(我之前的版本总是返回01,因为它正在向下一个世纪进行舍入):

@Override
public void setText(CharSequence text, BufferType type) {
    Spannable s = getTextWithImages(getContext(), text);
    super.setText(s, BufferType.SPANNABLE);
}

翻译成您的代码:

SELECT SUBSTR(FLOOR(to_char(systimestamp, 'YYYY')/10)*10,3,1) || 1 FROM dual

答案 2 :(得分:0)

DECLARE
   dDate25   DATE;
   numYear   NUMBER;
BEGIN
   dDate25 := TO_DATE ('2016-01-27', 'YYYY-MM-DD');

   SELECT (ROUND (TO_CHAR (dDate25, 'YYYY') / 100, 0) * 100) + 1
     INTO numYear
     FROM DUAL;

   DBMS_OUTPUT.PUT_LINE('First year of the nearest century to ' || TO_CHAR(dDate25, 'YYYY-MM-DD') || ' is: ' || numYear);

   dDate25 := TO_DATE ('2116-01-27', 'YYYY-MM-DD');

   SELECT (ROUND (TO_CHAR (dDate25, 'YYYY') / 100, 0) * 100) + 1
     INTO numYear
     FROM DUAL;

   DBMS_OUTPUT.PUT_LINE('First year of the nearest century to ' || TO_CHAR(dDate25, 'YYYY-MM-DD') || ' is: ' || numYear);

   dDate25 := TO_DATE ('2051-01-27', 'YYYY-MM-DD');

   SELECT (ROUND (TO_CHAR (dDate25, 'YYYY') / 100, 0) * 100) + 1
     INTO numYear
     FROM DUAL;

   DBMS_OUTPUT.PUT_LINE('First year of the nearest century to ' || TO_CHAR(dDate25, 'YYYY-MM-DD') || ' is: ' || numYear);
END;

输出:

  

2016-01-27最近世纪的第一年是:2001年

     

最近的世纪到2116-01-27的第一年是:2101

     

最近的世纪到2051年1月27日的第一年是:2101

ROUND (TO_CHAR (dDate25, 'YYYY') / 100, 0) * 100为您提供最近的世纪,即它将在2055年到2100年之间。添加+1会为您提供最近世纪的第一年。

如果你需要在日期变量中,你可以TO_DATE(numYear || '-01-01', 'YYYY-MM-DD')获得最近世纪第一年的1月1日。