我在oracle 12c上有table_name,其中column_name1的数据类型为" TIMESTAMP(6)WITH TIME ZONE"。我正在使用SQL Developer。
当我使用SQL Developer从此column_name1中选择任何内容时,我看到的日期如下:19-SEP-17 03.19.55.000000000 PM +00:00
是UTC格式。
如果我在我的SQL中使用相同的格式并将其作为字符串在where子句中使用它可以正常工作。例如:
select column_name1 from table_name where column_name1 = '19-SEP-17 03.19.55.000000000 PM +00:00';
但我知道建议在这种情况下将字符串转换为日期。因此,当我尝试使用TO_TIMESTAMP执行此操作时,我无法在SQL中找到要添加的正确格式。
我试过的是:
select column_name1 from table_name where column_name1 = TO_TIMESTAMP('19-SEP-17 03.19.55.000000000 PM +00:00', 'DD-MON-YYYY HH:MI:SS.FF A.M. TZH:TZM');
即使A.M./PM已经存在,我仍然会收到错误:
AM/A.M. or PM/P.M. required
我尝试添加' nls_date_language = american'同样但仍然会得到同样的错误。
我在这里缺少什么?如何更改TO_TIMESTAMP格式以便将此字符串转换为TIMESTAMP?
答案 0 :(得分:3)
您实际上是否正在使用TO_TIMESTAMP_TZ
- 因为该列是时间戳WITH TIME ZONE,输入字符串和格式模型都是时间戳WITH TIME ZONE? (如果您使用TO_TIMESTAMP
,则会出现不同的错误,例如“日期格式无法识别” - 因为您不能在格式模型中为时区添加时区格式元素而没有时区)。
假设是这种情况:问题是由输入字符串中的PM
(没有点)传递,但格式模型中有A.M.
(带点)。在两个地方使用相同的格式 - 使用点或不使用它们,但要保持一致。
在某些地方,甲骨文不会对不匹配的分隔符大惊小怪,但在这种情况下确实如此。如果您愿意,可以通过文档查找Oracle将尝试的确切替换;但这听起来像是一次学术练习。只需在输入字符串和格式模型之间保持一致,就不会有任何问题。