代码之家  ›  专栏  ›  技术社区  ›  TRomesh

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

  •  1
  • TRomesh  · 技术社区  · 7 年前

      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 回复  |  直到 7 年前
        1
  •  2
  •   MT0    7 年前

    [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 条款您需要使用相关子查询或 合并 陈述

    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_日期_格式 是一个会话参数,每个用户都可以将其设置为他们想要的任何值,因此您不应该依赖于此来保持一致。

    相反,将间隔文字添加到日期(不需要与字符串进行任何转换):

    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' )