Sql 在一列中可以有两种格式的日期吗?

Sql 在一列中可以有两种格式的日期吗?,sql,oracle,case,Sql,Oracle,Case,我想知道是否有可能在一列中包含两种格式的日期 问题是,如果表为NULL(即日期),我需要一个默认值,如果表不为NULL,那么我只需要一个时间戳 我已经提出了一个应该这样做的理由,但它不起作用 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

我想知道是否有可能在一列中包含两种格式的日期

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

我已经提出了一个应该这样做的理由,但它不起作用

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
15:35:00

(这就是我想要的)

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

s.time为空时的情况 然后 截止日期('1901年1月1日01:00:00','dd-MON-yyyyy HH24:MI:SS')
否则 子字符串() 以时间结束


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

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
除非您希望依赖
NLS\u DATE\u格式,否则
TO\u CHAR(TO\u DATE())
是多余的,因此这更简单:

CASE WHEN s.time IS null 
THEN 
  '01-JAN-1901 01:00:00'
ELSE
  TO_CHAR(s.time, 'HH24:MI:SS') 
END AS time
这两种方法都有


您从初始版本获得ORA-01858,因为您正在将
日期
传递到
TO_DATE()
。这需要一个字符串参数,这会导致隐式转换,因此您实际上在执行:

TO_DATE(TO_CHAR(s.time), 'HH24:MI:SS')
根据您的
NLS\u DATE\u格式设置,它似乎是:

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
部分。

您不能有只保存时间的日期列。您将获得
01-JUL-2013
,因为:“如果您指定的日期值没有日期,那么默认日期是当前月份的第一天”。明白了,谢谢Alex。因此,如果我理解正确的话,没有办法在日期类型列中只显示时间?你不能只存储时间;您可以在查询时显示您想要的任何内容。如果您只想存储一个可以查看的时间,但我不清楚为什么在值为null时存储任意日期-为什么不只存储null而不是神奇的日期?你真的不是在谈论存储,这只是关于显示已经存储的值吗?是的,这是关于显示存储的数据。因此,如果数据为空,那么我应该显示一个日期,但是如果已经有日期,我只想显示一个时间。我的问题是,是否可以只在一列中执行?是否需要在其他查询/过程中使用此值,或者只需要一个输出?因为,如果您只需要一个输出,您可以将所有值转换为您想要的字符。非常感谢您的澄清。这很有帮助
TO_DATE('16-JUL-2013 15:35:00', 'HH24:MI:SS')