我有两个表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
答案 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' )