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'是表不规则性的参数。错误在哪里?
答案 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
答案 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'