我的表缺席有以下字段
id,utilisateurs_id,date_debut,date_fin,type,`statut
我将根据示例解释我的问题:
----------------+------------------+------------------+---------------------
|id | utilisateurs_id |date_debut | date_fin |
----------------+------------------+------------------+---------------------
| 15 | 12 |2012-01-20 |2012-01-25 |
----------------+------------------+------------------+---------------------
| 20 | 12 |2012-01-27 |2012-01-29 |
----------------+------------------+------------------+---------------------
| 23 | 17 |2012-01-20 |2012-01-2 |
----------------+------------------+------------------+---------------------
| 27 | 12 |2012-04-10 |2012-04-12 |
----------------+------------------+------------------+---------------------
我想找到一种填充临时表tempabsence的方法,该临时表tempabsence具有与缺省相同的字段,如果id有冗余,则计算enddate和startdate之间的差异,如果此差异小于3,则enddate获取值startdate else在tempabsences中插入此列
----------------+------------------+------------------+---------------------
|id | utilisateurs_id |date_debut | date_fin |
----------------+------------------+------------------+---------------------
| 15 | 12 |2012-01-20 |2012-01-29 |
----------------+------------------+------------------+---------------------
| 23 | 17 |2012-01-20 |2012-01-2 |
----------------+------------------+------------------+---------------------
| 27 | 12 |2012-04-10 |2012-04-12 |
----------------+------------------+------------------+---------------------
我尝试实现它,但脚本没有返回我想要的结果。
CREATE TEMPORARY TABLE tempabsences LIKE absences;
INSERT INTO tempabsences(id ,utilisateurs_id,date_debut,tempabsences.date_fin,type,statut)
SELECT absences.utilisateurs_id ,absences.utilisateurs_id,absences.date_debut,absences.date_fin,absences.type,absences.statut
FROM absences
ORDER BY absences.date_debut ASC,absences.date_fin ASC, absences.utilisateurs_id ASC
ON DUPLICATE KEY UPDATE tempabsences.date_fin=IF(abs(DATEDIFF(tempabsences.date_fin,absences.date_debut)<3) and (tempabsences.utilisateurs_id=absences.utilisateurs_id),tempabsences.date_fin,absences.date_fin),
tempabsences.utilisateurs_id= IF(abs(DATEDIFF(tempabsences.date_fin,absences.date_debut)<3)and (tempabsences.utilisateurs_id=absences.utilisateurs_id),tempabsences.utilisateurs_id,absences.utilisateurs_id),
tempabsences.id=IF(abs(DATEDIFF(tempabsences.date_fin,absences.date_debut)<3)and (tempabsences.utilisateurs_id=absences.utilisateurs_id),tempabsences.id,(select tempabsences.id from absences ) )
;
任何帮助将不胜感激。 问候。
答案 0 :(得分:1)
我认为它必须像
BEGIN
FOR rec_ IN (
SELECT absences.utilisateurs_id ,absences.utilisateurs_id,absences.date_debut,absences.date_fin,absences.type,absences.statut
FROM absences
ORDER BY absences.date_debut ASC,absences.date_fin ASC, absences.utilisateurs_id ASC
)
BEGIN
INSERT INTO tempabsences(rec_.id ,rec_.utilisateurs_id,rec_.date_debut,rec_.tempabsences.rec_.date_fin,rec_.type,rec_.statut);
EXCEPTION
WHEN dup_val_on_index THEN
for rec2_ in (SELECT * FROM tempabsences WHERE id = rec_.utilisateurs_id) loop
if rec2_.date_fin - rec2_.date_debut < 3 then
update absences
set date_fin = date_debut
where utilisateurs_id = rec_.utilisateurs_id;
else
----- else statement here
end if;
end loop;
END;
END;