从另一个表获取的值更新一个表的日期字段

时间:2018-12-20 11:08:32

标签: sql date join oracle11g sql-update

我有两个表A和B,它们两个都有日期字段,但格式不同('MM / DD / YYYY HH:MI:SS'和'MM / DD / YYYY'),而且它们都有一个公用字段,称为invoiced_value 。我需要从表B(带有'MM / DD / YYYY')的值更新表A(带有'MM / DD / YYYY HH:MI:SS')的日期值。我可以使用以下查询吗?我可以将这样的日期追加到to_date(e.invoiced_date ||'3:56:24','MM / DD / YYYY HH:MI:SS')吗?

  UPDATE Table1
  SET m.invoiced_date = to_date(e.invoiced_date ||' 3:56:24', 'MM/DD/YYYY HH:MI:SS')
  FROM Table2 e, Table1 m
  WHERE m.invoiced_value = e.invoiced_value

1 个答案:

答案 0 :(得分:2)

[TL; DR] 使用MERGE语句:

MERGE INTO Table1 dst
USING Table2 src
ON ( src.invoiced_value = dst.invoiced_value )
WHEN MATCHED THEN
  UPDATE SET invoiced_date = TRUNC( src.invoiced_date ) + INTERVAL '3:56:24' HOUR TO SECOND;

  

我可以使用以下查询吗?

否,UPDATE statement没有FROM子句。您将需要使用相关的子查询或MERGE语句。

  

我可以附加这样的日期to_date(e.invoiced_date ||' 3:56:24', 'MM/DD/YYYY HH:MI:SS')吗?

也许...但是您不应该这样。 TO_DATE( string_value, format_model )将字符串作为第一个参数(并且||字符串连接运算符也需要字符串参数来连接),因此您的e.invoiced_date将被隐式地从DATE转换为字符串,并且您的表达式有效:

to_date(
  TO_CHAR(
    e.invoiced_date,
    ( SELECT value FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
  ) || ' 3:56:24',
  'MM/DD/YYYY HH:MI:SS'
)

如果您的NLS_DATE_FORMAT会话参数为MM/DD/YYYY,则您的查询将起作用。如果有所不同,则您的查询将引发异常或工作,但给出错误的结果。由于NLS_DATE_FORMAT是一个会话参数,并且每个用户都可以将其设置为所需的任何值,因此您不应该依赖此参数来保持一致。

相反,在日期上添加一个间隔文字(不需要对字符串进行任何转换):

TRUNC( src.invoiced_date ) + INTERVAL '3:56:24' HOUR TO SECOND

或将日期明确转换为正确格式的字符串:

TO_DATE( TO_CHAR( e.invoiced_date, 'MM/DD/YYYY' ) || ' 3:56:24', 'MM/DD/YYYY HH24:MI:SS' )