starmann
Goto Top

SQL datum kleiner today

Hi,

habe eine kleine frage.
wie kann ich "datum < today and datum is not null" umsetzen?
datum DATE,

CONSTRAINT medium_datum CHECK(datum IS NOT NULL AND datum < sysdate)
Das war mein Ansatz es kommt aber immer ein Fehler.

Content-Key: 342222

Url: https://administrator.de/contentid/342222

Printed on: April 26, 2024 at 03:04 o'clock

Member: em-pie
em-pie Jul 01, 2017 updated at 16:03:45 (UTC)
Goto Top
Moin,

  • Welche DB hast du denn am Wickel?
      • MS SQL
      • MySQL
      • Oracle
      • PostgreSQL
      • DB2
      • SyBase
      • Access,
      • ...
  • In welchem Format liegt dein Feld "datum" vor?
  • willst du ein klassische SELECT oder UPDATE oder INSERT oder ALTER bzw. CREATE TABLE ausführen?

Wenn es vom Typ 'Date' ist, könnte es unter MS SQL wie folgt aussehen

Dann denke ich, wird dein Problem sein, dass du eine Spalte als Date benannt hast. Benenne die mal z.B. in myDate um

SELECT 
 datum AS myDate
 ...
FROM
 ...
WHERE 
 myDate IS NOT NULL
 OR CONVERT (date, GETDATE()) > myDate

Gruß
em-pie
Member: StarMann
StarMann Jul 01, 2017 at 16:23:30 (UTC)
Goto Top
Es ist eine Oracle

CREATE TABLE position(
LID INT,
datum DATE,
notiz VARCHAR(250),
CONSTRAINT position_LID PRIMARY KEY(LID),
CONSTRAINT position_datum CHECK(datum IS NOT NULL AND sollruckgabe > GETDATE())
);
Member: em-pie
em-pie Jul 01, 2017, updated at Jul 02, 2017 at 12:11:17 (UTC)
Goto Top
OK...

dann wäre vermutlich hier der erste Ansatz:
https://stackoverflow.com/questions/8424900/check-constraint-on-date-of- ...
Mit dem Check sieht es schon mal nicht falsch aus, auf den ersten Blick.
Hast du es mal mit einem TRIGGER versucht?

Welche Fehlermeldung erhältst du eigentlich bei deinem obigen Code?

€dit: Satz gestrichen (s.u.)
Member: Biber
Solution Biber Jul 01, 2017 updated at 22:11:36 (UTC)
Goto Top
Moin em-pie,


Zitat von @em-pie:

Mit dem Check sieht es schon mal nicht falsch aus, auf den ersten Blick.
Na ja, allerdings ist nirgends ein Feld sollruckgabe vorhanden, Oracle kennt kein GetDate(), es müsste sysdate sein, welches aber nicht erlaubt ist als Wert in einer Check-Constraint und es müsste kleiner als statt grösser heissen. Aber sonst sieht es gut aus.

Also, geht so nicht.
Workaround:
Feld Datum auf Not nullable.
Vorher ein Feld createddate definieren Not null with default sysdate und darauf die Checkconstraint des Feldes Datum beziehen.

Grüße
Biber
Member: juhu01
juhu01 Jul 02, 2017 at 10:56:19 (UTC)
Goto Top
Probier doch einmal
select * from my_table where my_date < now() ;

sollte deine Probleme beheben.
Member: Biber
Solution Biber Jul 02, 2017 at 11:32:19 (UTC)
Goto Top
Moin StarMann,

Bevor du einen der letzten Kommentare für bare Münze nimmst oder gar meinen Workaround umsetzt, zur Klarstellung:

Du kannst in einer Check-Constraint nicht heute bzw. Sysdate verwenden, da der Wert nicht deterministisch ist. Ein fester Wert wie 12.08.2016 wäre erlaubt.

Du könntest in der Theorie den o.a. Workaround machen oder in einem Before-insert-Trigger das Datum prüfen und ggf. auf einen gültigen Wert setzen.
Würde aber kein Mensch so lösen. Jeder würde bei einem nicht erlaubten Wert eine Fehlermeldung zeigen wollen, damit der User diesen Wert berichtigt. Also eine programmatische Lösung mit Komfort und nicht nur Datensatz ablehnen und verwerfen.

Unabhängig davon kann das Feld Datum auf Not nullable gesetzt werden.

Grüße
Biber
Member: em-pie
Solution em-pie Jul 02, 2017 updated at 12:12:18 (UTC)
Goto Top
Zitat von @em-pie:

Mit dem Check sieht es schon mal nicht falsch aus, auf den ersten Blick.
Na ja, allerdings ist nirgends ein Feld sollruckgabe vorhanden, Oracle kennt kein GetDate(), es müsste sysdate sein, welches aber nicht erlaubt ist als Wert in einer Check-Constraint und es müsste kleiner als statt grösser heissen. Aber sonst sieht es gut aus.

Jepp, du hast recht... hatte den Satz erst geschrieben und wollte den nach dem Umschreiben eigentlich wieder rausgeschmissen haben.... habe wohl zu schnell auf Senden geklickt und nicht nochmal quer gelesen...

Egal.. Gut, dass du hier nochmal vorbei geschaut hast face-smile

Deine berechtigte Klarstellung (dass ein Sysdate in einem Check-Constraint nicht möglich ist) wird zudem ja noch vom obigen Link unterstrichen, denn auch in der Lösung wird dies explizit nochmal erwähnt.

Ansonsten, lieber TO, wie Biber schrieb, würde ich die Validierung der Daten ebenfalls zunächst in der GUI vorsehen. Also grundsätzlich versucht man ja immer das Problem dort abzufangen, wo es entsteht....
Member: StarMann
StarMann Jul 02, 2017 at 20:05:07 (UTC)
Goto Top
Ok danke Euch