0

我有一个视图,我正在选择一个日期列并将其作为 denodo 中的本地日期读取。在我的专栏中,我有一个像这样的日期 '00-Jan-1900',这是一个问题,所以我想用空替换它。当我运行这个查询时,我得到的结果如表 2 所示。但我想要的只是一个空记录来代替这个日期,看起来像 TABLE3。

询问:

select
to_localdate('dd-MM-yyyy', substring(replace("DATE", '00-Jan-1900', ''), 0, 10)) AS dtm
from XX

表格1:

DATE
22-Dec-2016
00-Jan-1900
30-Sep-2014

更换日期后我得到

表2:

DATE
0201-12-22

0201-09-30

有没有办法得到这样的输出表?

表 3:日期 2016 年 12 月 22 日

30-Sep-2014
4

1 回答 1

0

在我的专栏中,我有一个'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
于 2020-11-25T10:49:25.800 回答