01846. 00000-“星期几无效”

时间:2018-09-26 21:10:06

标签: sql oracle oracle11g

updateDate ='Mon Mar 13 22:43:29 +0000 2017'
select length, 
       replace(updateDate,'+0000','') as fecha,
       TO_TIMESTAMP_TZ(
         TO_DATE(
           replace(updateDate,'+0000 ',''),
           'DY  MON DD  HH24:MI:SS YYYY'
         ),
         '+00:00',
         '-05:00'
       ) as fechaCol
from   irregularities

我想将字符串转换为格式日期,updateDate和'+0000'是表不规则性的参数。错误在哪里?

2 个答案:

答案 0 :(得分:1)

看起来像你想要的

to_timestamp_tz(updateDate,
  'DY MON DD HH24:MI:SS TZHTZM YYYY'),
  'NLS_DATE_LANGUAGE=ENGLISH')
  at time zone '-05:00'

将整个原始字符串(包括时区偏移量)转换为带有时区的时间戳-指定日期和月份的名称为英文;然后在-5:00时区为您提供该值。尽管您可能想使用时区而不是偏移量。

演示:

-- CTE for sample data
with irregularities (updateDate) as (select 'Mon Mar 13 22:43:29 +0000 2017' from dual)
-- actual query
select 
    to_timestamp_tz(updateDate,
      'DY MON DD HH24:MI:SS TZHTZM YYYY',
      'NLS_DATE_LANGUAGE=ENGLISH')
      at time zone '-05:00' as fechaCol
from 
    irregularities;

FECHACOL                            
------------------------------------
2017-03-13 17:43:29.000000000 -05:00

db<>fiddle

答案 1 :(得分:1)

来自TO_TIMESTAMP_TZ documentation

  

语法

TO_TIMESTAMP_TZ (char-exp [, fmt [ 'nlsparam' ] ])
     

参数

     

char-exp   您想要转换的文本表达式。

     

fmt   指定用于转换文本表达式的日期时间格式模板。有关日期时间格式模板的更多信息,请参见表9-4,“日期时间格式元素”。

     

省略此参数时,该函数将对象的默认格式为TIMESTAMP_TZ

     

nlsparam   指定返回月份和日期名称和缩写的语言。该参数可以具有以下形式:

'NLS_DATE_LANGUAGE = language'
     

如果省略此参数,则该函数将默认日期语言用于会话。

TO_DATE返回日期数据类型,TO_TIMESTAMP_TZ期望第一个参数使用文本表达式,因此Oracle将是“有帮助的”,并使用{{1}进行从日期到文本的隐式转换},并将使用会话的默认日期格式(由TO_CHAR会话参数指定),因此查询有效:

NLS_DATE_FORMAT

正是这种隐式转换导致您的错误,因为默认的SELECT TO_TIMESTAMP_TZ( TO_CHAR( TO_DATE( replace(updateDate,'+0000 ',''), 'DY MON DD HH24:MI:SS YYYY' ), (SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT') ), '+00:00', '-05:00' ) as fechaCol from irregularities NLS_DATE_FORMAT的格式不匹配。

解决方案

您不需要使用TO_TIMESTAMP_TZ。只需直接致电TO_DATE

TO_TIMESTMAP_TZ

SELECT TO_TIMESTAMP_TZ( updateDate 'DY MON DD HH24:MI:SS TZHTZM YYYY', 'NLS_DATE_LANGUAGE=ENGLISH' ) as fechaCol from irregularities TZH格式的模型将读取时区的小时和分钟,并将时间戳设置为适用于输入的时区。

目前尚不清楚TZM函数的+00:00-05:00参数是要实现什么的(因为第二个参数应该是格式模型,第三个参数应该是NLS参数),但是如果您尝试从一个时区转换为另一个时区,则只需使用TO_TIMESTAMP_TZ

AT TIME ZONE '-05:00'