我有一个像01/03/2016的日期。我想在日期类型中找回03/2016。
我知道提取功能,但它给了我char类型。 我不想使用to_char。 有没有办法做到这一点?
答案 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;