Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Vergleichsoperatoren für varchar?

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Gwahlers, 16 September 2015.

  1. Gwahlers

    Gwahlers Benutzer

    Guten Tag,
    über ein php Formular werden Daten "03" und "01" zu eine Ziffernfolge "0301" zusammengefügt. Diese werden derzeit in ein Feld varchar gespeichert, da die führende 0 erhalten bleiben soll. Ich möchte dann aber durch eine Abfrage die Einträge erhalten die Beispielsweise größer sind als "0223". Kann man für ein varchar-Feld eine solche Abfrage starten? Oder ist dies nur für INT Felder möglich?

    SELECT * FROM (tabelle) WHERE datum>='0223';

    Wenn ich die Daten in ein Feld mit INT packe, wird natürlich die führende Null entfernt. Oder kann man ein Standard definieren, der dies verhindert?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Du kannst einen TEXT nach INT casten, und Du kannst einen INT bei der Ausgabe passend formatieren. Wenn Du rechnen willst böte sich ein Datentyp an, der dazu geeignet ist. Ein Datum '0223' ist übrigens Bullshit.
     
  3. Gwahlers

    Gwahlers Benutzer

    Es handelt sich bei diesem Projekt um eine Geburtstagsliste, die nur dann Daten anzeigt, wenn der aktuelle Benutzer seinen Geburtstag eingetragen hat. Ich hätte dies alles gerne über DATE gemacht, es darf allerdings keine Jahreszahl mitgegeben werden.
    Das Formular nimmt 00 als Tag an und 00 als Monat an. Diese werden umgekehrt zum vierstelligen String, damit ich diese bei der SELECT abfrage sortieren kann. Im Nachhinein wird diese 4 stellige zahl wieder zu einem 23.02. Datum ausgegeben. Dies haut auch alles hin. Allerdings scheitere ich dann bei dem Thema "Geburtstage in den nächsten 2 Wochen anzeigen". Ich bin auf dem Gebiet ein "Einsteiger". Ansonsten hätte ich dies auch anders gemacht. Noch einmal zu der Kernfrage. Könnte man, unabhängig von der richtigen Syntax eine oben genannte SELECT-Abfrage für ein varchar feld durchführen?
     
  4. Gwahlers

    Gwahlers Benutzer

    Zum Verständnis:
     

    Anhänge:

  5. akretschmer

    akretschmer Datenbank-Guru

    Warum nicht?
     
  6. Gwahlers

    Gwahlers Benutzer

    Wenn der Benutzer sieht, dass er sein Geburtsjahr angeben soll, dann geht er auch davon aus, dass dies an alle Kollegen ausgegeben wird. Dies will ich ja gerade in einer Datenschutzkonformen Geburtstagsliste für das Intranet nicht.
    Zur Not könnte ich immer nur die "Geburtstage des Tages" anzeigen. DIe könnte ich über die php Funktion date() regeln.
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Das, was in der DB steht, muß nicht das sein, was in einer Liste ausgegeben wird. Um aber zu berechnen, wer im Zeitraum zwischen heute und heute + 14 Tage Geburtstag hat ist es sinnvoll, mit DATE zu arbeiten. Es gibt ansonsten so Fallstricke wie Monatswechsel, Jahreswechsel, Schaltjahr, ...
     
  8. Gwahlers

    Gwahlers Benutzer

    Genau diese Fallstricke beschäftigen mich.
    Wie sähe eine Abfrage für die nächsten 14 Tage aus?
    SELECT * FROM (Tabelle) WHERE datum=?

    Kann man ein Eingabefeld <input> so formatieren, dass es kein Jahr annehmen wird? Habe bis jetzt nur <input type='month'> kennen gelernt. Welches JJJJ.MM annimmt. Was natürlich auch nicht benutzerfreundlich ist.
     
  9. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select * from geb ;
     id |  d
    ----+------------
      1 | 2000-09-18
      2 | 2001-10-18
    (2 rows)
    
    test=*# select * from geb where extract(year from age(d)) != extract(year from age(current_date + '14days'::interval, d));
     id |  d
    ----+------------
      1 | 2000-09-18
    (1 row)
    
    test=*# select * from geb where extract(year from age(d)) != extract(year from age(current_date + '34days'::interval, d));
     id |  d
    ----+------------
      1 | 2000-09-18
      2 | 2001-10-18
    (2 rows)
    [/code[]
    
    Der Rest ist Ausgabeformatierung.
    
    [code]
    test=*# select *, to_char(d, 'dd.mm') from geb where extract(year from age(d)) != extract(year from age(current_date + '34days'::interval, d));
     id |  d  | to_char
    ----+------------+---------
      1 | 2000-09-18 | 18.09
      2 | 2001-10-18 | 18.10
    (2 rows)
    
     
  10. Gwahlers

    Gwahlers Benutzer

    Das ist schon eher was ich bräuchte. Allerdings kommt es zu einen Syntaxfehler... Ich führe aus:
    select * from rai_geburtstage where extract(year from age(datum)) != extract(year from age(current_date + '34days'::interval, datum));

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '::interval, datum))' at line 1

    In der Tabelle sind die gleichen Geburtstage vorhanden wie im Beispiel.
     
  11. akretschmer

    akretschmer Datenbank-Guru

    Äh ja, Du hast MySQL, ich nicht. Schau, ob da alternative Funktionen wie in PostgreSQL verfügbar sind. Oder nehme gleich eine richtige DB.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden