带+00:00的ORACLE日期格式

时间:2019-03-08 13:57:42

标签: sql oracle

我正在尝试执行此oracle delete语句

DELETE FROM mySchema.mytable
WHERE myCol= 'abc'
  and DATE_TIME_UTC >= to_date('2011-07-30 00:00:00+00:00','yyyy-mm-dd HH24:MI:SS+TZH:TZM')
  and DATE_TIME_UTC <= to_date('2011-07-31 23:55:00+00:00','yyyy-mm-dd HH24:MI:SS+TZH:TZM')

但我明白了

  

ORA-01821:日期格式无法识别。

最可能是由于+TZH:TZM部分,但我可以在Google上找到任何东西来获取正确的格式。

感谢您在设置正确格式或指向可以找到正确格式的指针方面的帮助

谢谢

1 个答案:

答案 0 :(得分:3)

DATE数据类型不包含任何时区信息。请改用TIMESTAMP WITH TIME ZONE,即to_timestamp_tz('2011-07-30 00:00:00+00:00','yyyy-mm-dd HH24:MI:SS+TZH:TZM')

DELETE FROM mySchema.mytable
WHERE myCol= 'abc'
  and DATE_TIME_UTC >= to_timestamp_tz('2011-07-30 00:00:00+00:00','yyyy-mm-dd HH24:MI:SS+TZH:TZM')
  and DATE_TIME_UTC <= to_timestamp_tz('2011-07-31 23:55:00+00:00','yyyy-mm-dd HH24:MI:SS+TZH:TZM')

但是,我假设DATE_TIME_UTCDATE而不是TIMESTAMP WITH TIME ZONE的值。在这种情况下,您必须像这样将时间戳值转换为UTC:

DELETE FROM mySchema.mytable
WHERE myCol= 'abc'
  and DATE_TIME_UTC >= SYS_EXTRACT_UTC(to_timestamp_tz('2011-07-30 00:00:00+00:00','yyyy-mm-dd HH24:MI:SS+TZH:TZM'))
  and DATE_TIME_UTC <= SYS_EXTRACT_UTC(to_timestamp_tz('2011-07-31 23:55:00+00:00','yyyy-mm-dd HH24:MI:SS+TZH:TZM'))

或者您也可以采用其他方法(最有可能性能降低):

DELETE FROM mySchema.mytable
WHERE myCol= 'abc'
  and FROM_TZ(DATE_TIME_UTC, 'UTC') >= to_timestamp_tz('2011-07-30 00:00:00+00:00','yyyy-mm-dd HH24:MI:SS+TZH:TZM')
  and FROM_TZ(DATE_TIME_UTC, 'UTC') <= to_timestamp_tz('2011-07-31 23:55:00+00:00','yyyy-mm-dd HH24:MI:SS+TZH:TZM')

当然,由于所有,您的时间都以UTC表示,因此您可以简化它,并且根本不需要考虑时区信息:

DELETE FROM mySchema.mytable
WHERE myCol= 'abc'
  and DATE_TIME_UTC >= to_date('2011-07-30 00:00:00','yyyy-mm-dd HH24:MI:SS')
  and DATE_TIME_UTC <= to_date('2011-07-31 23:55:00','yyyy-mm-dd HH24:MI:SS')

但是上面的解决方案更通用。