diff --git a/03-other-functions.sql b/03-other-functions.sql
index 450138b5fe285e59b57f9c99c2d31148f35e85f4..e3ba587efe30fe6b9caaff5fe1a7070f80ef2bad 100644
--- a/03-other-functions.sql
+++ b/03-other-functions.sql
@@ -73,25 +73,41 @@ $func$ LANGUAGE sql;
 -- Trigger function that automatically updates start time and end time of jobs at phase update.
 -- This could be performed by business logic of each application that handles jobs but relying directly on the database ensures a better uniformity.
 
-CREATE OR REPLACE FUNCTION job_phase_updated() RETURNS TRIGGER 
+CREATE OR REPLACE FUNCTION job_phase_inserted() RETURNS TRIGGER 
 AS 
 $func$
 BEGIN
     IF new.phase = 'EXECUTING' THEN
         new.start_time := NOW();
-    ELSIF new.phase = 'COMPLETED' OR new.phase = 'ERROR' OR new.phase = 'ABORTED' THEN
+    ELSIF new.phase = 'COMPLETED' OR new.phase = 'ERROR' THEN
+        new.start_time := NOW();
         new.end_time := NOW();
     END IF;
     RETURN new;
 END;
 $func$ LANGUAGE plpgsql;
 
-CREATE TRIGGER job_update
-    BEFORE UPDATE OF phase ON job
-    FOR EACH ROW
-    EXECUTE PROCEDURE job_phase_updated();
+CREATE OR REPLACE FUNCTION job_phase_updated() RETURNS TRIGGER 
+AS 
+$func$
+BEGIN
+    IF new.phase != old.phase THEN
+        IF new.phase = 'EXECUTING' THEN
+            new.start_time := NOW();
+        ELSIF new.phase = 'COMPLETED' OR new.phase = 'ERROR' OR new.phase = 'ABORTED' THEN
+            new.end_time := NOW();
+        END IF;
+    END IF;
+    RETURN new;
+END;
+$func$ LANGUAGE plpgsql;
 
 CREATE TRIGGER job_insert
     BEFORE INSERT ON job
     FOR EACH ROW
+    EXECUTE PROCEDURE job_phase_inserted();
+
+CREATE TRIGGER job_update
+    BEFORE UPDATE OF phase ON job
+    FOR EACH ROW
     EXECUTE PROCEDURE job_phase_updated();