请求将SQL Server更新语句转换为Oracle SQL语句
转换后的Oracle兼容SQL语句
方式一:使用MERGE语句(适配多表关联更新场景)
MERGE INTO Attendance A USING (SELECT ShiftStartTime, ShiftEndTime FROM ShiftMaster WHERE Shift = :ShiftName) S ON (A.AttendanceId = :AttendanceId) WHEN MATCHED THEN UPDATE SET A.ShiftName = :ShiftName, A.ShiftStartTime = TRUNC(A.AttendanceDate) + (TO_DATE(S.ShiftStartTime, 'HH24:MI:SS') - TRUNC(TO_DATE(S.ShiftStartTime, 'HH24:MI:SS'))), A.ShiftEndTime = TRUNC(A.AttendanceDate) + CASE WHEN :ShiftName = 'NIGHT' THEN -1 ELSE 0 END + (TO_DATE(S.ShiftEndTime, 'HH24:MI:SS') - TRUNC(TO_DATE(S.ShiftEndTime, 'HH24:MI:SS'))), A.ModifiedBy = :UpdatedBy, A.ModifiedOn = SYSDATE;
方式二:使用UPDATE子查询(适合单条记录更新场景)
UPDATE Attendance A SET (ShiftName, ShiftStartTime, ShiftEndTime, ModifiedBy, ModifiedOn) = (SELECT :ShiftName, TRUNC(A.AttendanceDate) + (TO_DATE(S.ShiftStartTime, 'HH24:MI:SS') - TRUNC(TO_DATE(S.ShiftStartTime, 'HH24:MI:SS'))), TRUNC(A.AttendanceDate) + CASE WHEN :ShiftName = 'NIGHT' THEN -1 ELSE 0 END + (TO_DATE(S.ShiftEndTime, 'HH24:MI:SS') - TRUNC(TO_DATE(S.ShiftEndTime, 'HH24:MI:SS'))), :UpdatedBy, SYSDATE FROM ShiftMaster S WHERE S.Shift = :ShiftName) WHERE A.AttendanceId = :AttendanceId;
关键转换细节
- 变量格式:SQL Server的
@变量名替换为Oracle标准的:变量名绑定变量格式 - 日期截断:
DATEDIFF(day, 0, AttendanceDate)(提取纯日期部分)替换为Oracle的TRUNC(AttendanceDate) - 日期时间拼接:原SQL中
DATEADD+CAST的拼接逻辑,替换为TRUNC(日期) + 时间间隔的Oracle写法,实现日期与时间的合并 - 当前时间函数:
GETDATE()替换为Oracle的SYSDATE - 关联更新语法:Oracle不支持SQL Server的
UPDATE ... FROM ...多表关联写法,改用MERGE或子查询方式实现相同逻辑
内容的提问来源于stack exchange,提问作者Sudhir Mishra
相关产品推荐
相关产品推荐

