PLSQL - 如何仅从完整日期提取月份和年份

时间:2016-02-17 08:56:55

标签: sql oracle date

我有一个像01/03/2016的日期。我想在日期类型中找回03/2016。

我知道提取功能,但它给了我char类型。 我不想使用to_char。 有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

日期没有格式 - 它由一系列字节在内部表示,您可以使用这些字节来表示:

SELECT DUMP( SYSDATE ) FROM DUAL;

输出的内容(日期2016-02-17T09:13:44Z):

Typ=13 Len=8: 224,7,2,17,9,13,44,0

如果你想要年份&那么你可以使用TRUNC( date_value, 'MM' )TO_CHAR( date_value, 'MM/YYYY' )

SELECT TRUNC( SYSDATE, 'MM' ) AS "Date",
       TO_CHAR( SYSDATE, 'MM/YYYY' ) AS monthyear,
       DUMP( TRUNC( SYSDATE, 'MM' ) ) AS "Bytes"
FROM   DUAL

哪些输出(注意,截断后最后4个字节都为零):

 Date                 | MonthYear | Bytes
--------------------------------------------------------------------
 2016-02-01T00:00:00Z | 02/2016   | Typ-13 Len=8: 224,7,2,1,0,0,0,0

但是,日期的输出基于NLS_DATE_FORMAT会话参数,当您使用此格式掩码输出日期时,您的客户端将执行隐式TO_CHAR

您可以通过查询找到当前的NLS_DATE_FORMAT(如上所示,我的设置为ISO8601格式YYYY-MM-DD"T"HH24:MI:SS"Z"):

SELECT VALUE
FROM   NLS_SESSION_PARAMETERS
WHERE  PARAMETER = 'NLS_DATE_FORMAT';

然后您可以使用以下方式更改它:

ALTER SESSION SET NLS_DATE_FORMAT = 'MM/YYYY';

然后当你这样做:

SELECT SYSDATE, DUMP( SYSDATE ) FROM DUAL;

您将获得输出:

 Date    | Bytes
-----------------------------------------------
 02/2016 | Typ=13 Len=8: 224,7,2,17,9,13,44,0

注意,最后4个字节并非全为非零(日期尚未截断),但现在输出只是月/年。

但是,将日期存储作为日期(日期和时间组件保持不变)更简单,然后在需要输出时使用TO_CHAR( date_value, 'MM/YYYY' ) 它,因为您将获得所需的输出格式而不会在整个会话中更改值。

答案 1 :(得分:0)

日期数据类型始终包含日,月,年,小时,分钟和秒。 您可以使用to_char()函数从日期中提取所需的组件。

select to_char(sysdate,'MM/YYYY') from dual;

但是您可以使用以下查询但它将返回01-FEB-16

select to_date('01-2016','DD\YYYY') from dual;