Erstellen eines Triggers zur Datumsprüfung

rayman88

Benutzer
Beiträge
11
Hallo,

heute hätte ich einmal eine Frage zum Thema Trigger.
Und zwar benötige ich einen der Prüft ob zwei Daten die eingegeben werden nicht mehr als 5 Jahre auseinander liegen. Unten seht ihr das was ich versucht habe, allerdings werden auch Datensätze eingetragen, die einen größeren Zeitintervall haben als 5 Jahre.
Was machen ich falsch?

CREATE DEFINER = CURRENT_USER TRIGGER `Datum_Check` BEFORE INSERT ON `Einsatzzeitraum` FOR EACH ROW
BEGIN
declare text varchar(255);
if datediff(new.Startdatum,new.Endedatum) >1826 then
set text = 'Zeitspanne größer 5 Jahre';
signal sqlstate '45000' set message_text = text;
end if;
end;
 
Werbung:
Hallo,

heute hätte ich einmal eine Frage zum Thema Trigger.
Und zwar benötige ich einen der Prüft ob zwei Daten die eingegeben werden nicht mehr als 5 Jahre auseinander liegen. Unten seht ihr das was ich versucht habe, allerdings werden auch Datensätze eingetragen, die einen größeren Zeitintervall haben als 5 Jahre.
Was machen ich falsch?

CREATE DEFINER = CURRENT_USER TRIGGER `Datum_Check` BEFORE INSERT ON `Einsatzzeitraum` FOR EACH ROW
BEGIN
declare text varchar(255);
if datediff(new.Startdatum,new.Endedatum) >1826 then
set text = 'Zeitspanne größer 5 Jahre';
signal sqlstate '45000' set message_text = text;
end if;
end;


Das geht über einen Check-Constraint:

Code:
test=# create table rayman( s date, e date, check((e-s) < 5*365));
CREATE TABLE
Time: 2,093 ms
test=*# insert into rayman values ('2008-01-01','2010-01-01');
INSERT 0 1
Time: 0,519 ms
test=*#
test=*#
test=*# insert into rayman values ('2000-01-01','2010-01-01');
ERROR:  new row for relation "rayman" violates check constraint "rayman_check"
DETAIL:  Failing row contains (2000-01-01, 2010-01-01).
Time: 0,280 ms

Allerdings nutzt Du MySQL - daher mußt Du noch ein paar Jahre warten, bis MySQL das kann.
 
Der Trigger sollte das auch schaffen ich weiß allerdings nicht wiso er nicht funktioniert.

Aber die Jahresdifferenzen in Tagen ist natürlich auch suboptimal. Was ist bei Schalttagen? Wenn MySQL datediff() das nicht leistet solltest du vieleicht anders vorgehen und mit date_add() auf das Ausgangsdatum 5 Jahre addieren um dann mit BETWEEN zu prüfen ob dein neues Datum in diesem Zeitraum liegt.
 
Habe das Problem lösen können, falls es jemanden interessiert oder er es auch noch einmal benötigen kann hier meine Lösung

CREATE DEFINER = CURRENT_USER TRIGGER `Datum_Check` BEFORE INSERT ON `Einsatzzeitraum` FOR EACH ROW
BEGIN
IF (NEW.endedatum> ADDDATE(new.startdatum, INTERVAL 5 year)) THEN
SET new.endedatum= ADDDATE(new.startdatum, INTERVAL 5 year);
END IF;
END

Es entspricht zwar nicht ganz dem was ich im ersten Post wollte, ist für die Lösung der Aufgabe aber vollkommen OK
 
Hi,

sollte aber auch mit der 1.ten Lösung gehen.

Code:
mysql> describe daten;
+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| daten_id  | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| daten_typ | varchar(20)      | NO   |     |         |                |
| dv        | timestamp        | YES  |     | NULL    |                |
| db        | timestamp        | YES  |     | NULL    |                |
+-----------+------------------+------+-----+---------+----------------+
4 rows in set (0,00 sec)

mysql> show create trigger compare_date\G
*************************** 1. row ***************************
               Trigger: compare_date
              sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
SQL Original Statement: CREATE DEFINER=`root`@`localhost` TRIGGER compare_date BEFORE INSERT ON daten FOR EACH ROW
BEGIN
DECLARE TEXT VARCHAR(255);
IF datediff(new.dv,new.db) >1826 THEN
SET TEXT = 'Zeitspanne größer 5 Jahre';
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = TEXT;
END IF;
END
  character_set_client: latin1
  collation_connection: latin1_swedish_ci
    Database Collation: latin1_swedish_ci
1 row in set (0,00 sec)

mysql> insert into daten values (null, 'test', '2014-01-01' , '2013-01-01');
Query OK, 1 row affected (0,00 sec)

mysql> insert into daten values (null, 'test', '2014-01-01' , '2009-01-01');
Query OK, 1 row affected (0,00 sec)

mysql> insert into daten values (null, 'test', '2014-01-01' , '2008-01-01');
ERROR 1644 (45000): Zeitspanne größer 5 Jahre
mysql>
mysql>

Gruss

Bernd
 
Werbung:
leider hat der erste trigge nichts bei mir gemacht, warum auch immer, der grund war nicht erkennbar, aber viele wegen führen bekanntlich ja nach rom
 
Zurück
Oben