在我的专栏中,我有一个'00-Jan-1900'
这样的日期,它给出了问题,所以我想用空替换它。
在 Oracle 中,您可以使用:
UPDATE table_name
SET value = NULL
WHERE EXTRACT( DAY FROM value ) = 0;
如果你有桌子:
CREATE TABLE table_name ( value DATE );
然后,通过创建此函数,需要跳过一些额外的箍以插入无效日期(即从二进制数据生成日期,以便可以跳过对日期值的正常验证过程):
CREATE FUNCTION createDate(
year int,
month int,
day int,
hour int,
minute int,
second int
) RETURN DATE DETERMINISTIC
IS
hex CHAR(14);
d DATE;
BEGIN
hex := TO_CHAR( FLOOR( year / 100 ) + 100, 'fm0X' )
|| TO_CHAR( MOD( year, 100 ) + 100, 'fm0X' )
|| TO_CHAR( month, 'fm0X' )
|| TO_CHAR( day, 'fm0X' )
|| TO_CHAR( hour + 1, 'fm0X' )
|| TO_CHAR( minute + 1, 'fm0X' )
|| TO_CHAR( second + 1, 'fm0X' );
DBMS_OUTPUT.PUT_LINE( hex );
DBMS_STATS.CONVERT_RAW_VALUE( HEXTORAW( hex ), d );
RETURN d;
END;
/
然后,您可以获得数据:
INSERT INTO table_name ( value )
SELECT DATE '1900-01-01' FROM DUAL UNION ALL
SELECT createDate( 1900, 1, 0, 0, 0, 0 ) FROM DUAL;
和:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
SELECT value,
TO_CHAR( value, 'YYYY-MM-DD HH24:MI:SS' ) AS string_value
FROM table_name;
输出:
价值 | 字符串值
:----------------- | :-----------------
1900-01-01 00:00:00 | 1900-01-01 00:00:00
1900-01-00 00:00:00 | 0000-00-00 00:00:00
要摆脱无效值,您可以使用:
UPDATE table_name
SET value = NULL
WHERE EXTRACT( DAY FROM value ) = 0;
然后:
SELECT value,
TO_CHAR( value, 'YYYY-MM-DD HH24:MI:SS' ) AS string_value
FROM table_name;
输出:
价值 | 字符串值
:----------------- | :-----------------
1900-01-01 00:00:00 | 1900-01-01 00:00:00
空 | 无效的
db<>在这里摆弄
有没有办法得到这样的输出表?
TABLE3:
DATE
22-Dec-2016
30-Sep-2014
您可以使用:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-Mon-YYYY';
然后只需运行您的查询,它应该会更改输出(但是当您运行查询时,您需要确保在以后的会话中设置格式)。
或者您可以使用以下方式指定格式模型TO_CHAR
:
SELECT TO_CHAR( your_column, 'DD-Mon-YYYY' ) AS your_column
FROM your_table