【问题标题】:Update date field of one table from the value taken from another table根据取自另一表的值更新一个表的日期字段
【发布时间】:2019-05-20 21:42:31
【问题描述】:

我有两个表 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

【问题讨论】:

标签: sql date join oracle11g sql-update


【解决方案1】:

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

【讨论】:

  • 感谢详细解答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多