0

我想知道是否可以在一列中有两种格式的日期。

问题是,如果表为 NULL(即日期),我需要一个默认值,如果表不为空,那么我只需要一个时间戳。

我已经制作了一个应该这样做的 CASE,但它不起作用。

CASE WHEN s.time IS null 
THEN 
  TO_DATE('01-JAN-1901 01:00:00', 'dd-MON-yyyy HH24:MI:SS') 
ELSE
  TO_DATE(s.time, 'HH24:MI:SS') 
END AS time

该语句给了我“ ORA-01858:在需要数字的地方发现了一个非数字字符。

如果我尝试这样的事情:

CASE WHEN s.time IS null 
THEN 
  TO_DATE('01-JAN-1901 01:00:00', 'dd-MON-yyyy HH24:MI:SS') 
ELSE 
  TO_DATE(TO_CHAR(s.time, 'HH24:MI:SS'), 'HH24:MI:SS') 
END AS time

它会起作用,但是它会在时间前面添加一个日期 - 它看起来像这样:(我不知道它从 2013 年 7 月 1 日到哪里得到那个日期)

 TIME
-------
01-JAN-1901 01:00:00
01-JUL-2013 15:35:00

而不是这个:

 TIME
-------
01-JAN-1901 01:00:00
15:35:00

(这就是我要的)

4

2 回答 2

1

由于它仅用于显示,您需要在您的 中使用TO_CHAR()而不是,但两个分支都必须生成一个字符串:TO_DATE()ELSE

CASE WHEN s.time IS null 
THEN 
  TO_CHAR(TO_DATE('01-JAN-1901 01:00:00', 'dd-MON-yyyy HH24:MI:SS')) 
ELSE
  TO_CHAR(s.time, 'HH24:MI:SS') 
END AS time

TO_CHAR(TO_DATE())除非你想依赖你的,否则这是多余的NLS_DATE_FORMAT,所以这更简单:

CASE WHEN s.time IS null 
THEN 
  '01-JAN-1901 01:00:00'
ELSE
  TO_CHAR(s.time, 'HH24:MI:SS') 
END AS time

两种方法的SQL Fiddle


您从初始版本中获得 ORA-01858,因为您正在传递一个DATEinto TO_DATE(). 这需要一个字符串参数,这会导致隐式转换,所以你真的在做:

TO_DATE(TO_CHAR(s.time), 'HH24:MI:SS')

根据您的NLS_DATE_FORMAT设置似乎是:

TO_DATE(TO_CHAR(s.time, 'DD-MON-YYYY HH24:MI:SS'), 'HH24:MI:SS')

所以你最终会尝试做类似的事情:

TO_DATE('16-JUL-2013 15:35:00', 'HH24:MI:SS')

并且您收到错误,因为它试图将JUL(或您的真实数据具有的任何月份)解释为分钟值的数值,对于MI您提供的格式掩码的一部分。

于 2013-07-17T10:01:30.883 回答
0

您可以使用子字符串并删除日期

CASE WHEN s.time 为 null THEN
TO_DATE('01-JAN-1901 01:00:00', 'dd-MON-yyyy HH24:MI:SS')
ELSE SUBSTRING() END AS time

于 2013-07-17T10:00:12.800 回答