FrankS: MySQL Frage: Datum in 2 Spalten in where vergleichen

Hallo zusammen,

ich doktor jetzt schon ewig an der Abfrage und komme einfach nicht weiter.

Ich habe eine Tabelle Termine mit 2 Spalten: Start und Ende im Format jeweils "YYYY-MM-DD".

Nun hätte ich gern abgefragt alle Termine zB. Monat Oktober.
Also Start >= Oktober <= Ende.

Getestet habe ich zB.

select * from termine where  
start > '2010-10-00' and  
ende < '2010-11-00' 

Ich habe schon viele Verschiedene Möglichkeiten probiert, aber es scheint als ob AND dabei zu OR wird.

VG Frank

  1. Hi,

    ich kenn mich mit MySQL nicht sonderlich aus, aber unter MSSQL muss man erst ein "Datumsobjekt" erzeugen mit dem man Daten aus der DB vergleichen kann.
    Evtl. ist das bei MySQL genauso und daher das ungewünschte verhalten?

    1. Hallo

      ich kenn mich mit MySQL nicht sonderlich aus, aber unter MSSQL muss man erst ein "Datumsobjekt" erzeugen

      Hä, wie bitte?
      Wenn man Datumswerte als Zeichenketten speichert (Aber welcher Trottel macht so etwas schon?) aber als Datum verwenden will, dann kann man nicht ohne weiteres darauf mit Datumsfunktionen zugreifen. Dazu muss man die Zeichenkette erst wieder in einen Datumswert zurückverwandeln (CONVERT, CAST ...) Das gilt imho für alle gemeingebräuclichen Datenbanksysteme.

      Ganz davon abgesehen, was soll '2010-10-00'  (ZERO-ZERO) für ein Datum sein? Monate fangen (nimmt man den hiesigen Kalender) für gewöhnlich bei Tag 1 an, sogar in der Schweiz.

      Ciao, Frank

      1. Hallo

        ich kenn mich mit MySQL nicht sonderlich aus, aber unter MSSQL muss man erst ein "Datumsobjekt" erzeugen

        Was genau verstehst Du unter "MSSQL"? Wenn ich gleich auf meinen SQL Server gehe und dort eine Tabelle anlege oder eine Abfrage, muss ich gar nichts erzeugen.

        --
        Vergesst Chuck Norris.
        Sponge Bob kann unter Wasser grillen!
        1. Hi!

          ich kenn mich mit MySQL nicht sonderlich aus, aber unter MSSQL muss man erst ein "Datumsobjekt" erzeugen
          Was genau verstehst Du unter "MSSQL"? Wenn ich gleich auf meinen SQL Server gehe und dort eine Tabelle anlege oder eine Abfrage, muss ich gar nichts erzeugen.

          MSSQL = Microsoft SQL Server. MySQL kennt keine Datumsobjekte. Datumsliterale werden einfach wie Strings geschrieben.

          Lo!

          1. nabend,

            MSSQL = Microsoft SQL Server. MySQL kennt keine Datumsobjekte. Datumsliterale werden einfach wie Strings geschrieben.

            Das hab ich mir gedacht. Aber was meint er mit 'erzeugen'? Ich erstelle eine Tabelle mit datum als date/time, frage select * from tabelle where datum = '05/oct/2010' und alles wird gut.

            --
            Vergesst Chuck Norris.
            Sponge Bob kann unter Wasser grillen!
            1. Hi!

              MSSQL = Microsoft SQL Server. MySQL kennt keine Datumsobjekte. Datumsliterale werden einfach wie Strings geschrieben.
              Das hab ich mir gedacht. Aber was meint er mit 'erzeugen'?

              Auch MSSQL kennt Datumsliterale, die wie Strings notiert werden, wenn man das SQL zu Fuß schreibt. Vielleicht meint er, wenn er mit einer Programmiersprache darauf zugreift, kann er keinen String verwenden, sondern muss ein Datumsobjekt erstellen.

              Ich erstelle eine Tabelle mit datum als date/time, frage select * from tabelle where datum = '05/oct/2010' und alles wird gut.

              Das wäre jedenfalls für MySQL kein gültiges Datumsliteral.

              Lo!

              1. sondern muss ein Datumsobjekt erstellen.

                Muss?

                1. Hi!

                  sondern muss ein Datumsobjekt erstellen.
                  Muss?

                  So schrieb dave.

                  Lo!

              2. Hoi!

                MSSQL = Microsoft SQL Server. MySQL kennt keine Datumsobjekte. Datumsliterale werden einfach wie Strings geschrieben.
                Das hab ich mir gedacht. Aber was meint er mit 'erzeugen'?

                Auch MSSQL kennt Datumsliterale, die wie Strings notiert werden, wenn man das SQL zu Fuß schreibt. Vielleicht meint er, wenn er mit einer Programmiersprache darauf zugreift, kann er keinen String verwenden, sondern muss ein Datumsobjekt erstellen.

                Keine Ahnung, was er zum Programmieren nimmt. Ich fummel mit Office 2003 (VBA) und schnödem altem ASP sowohl auf MS SQL Servern als auch auf Oracle Servern rum. Mit explititen Datumsobjekten hab ich noch nie gearbeitet. Entweder man bastelt sich nen SQL String zusammen und semmelt den per Passtrough-Query über die Leitung oder Fuhrwerkt wild per ADO über die Tabellen. Deshalb hab ich mal neugierig angefragt. Okay. Oracle is da etwas verzogen. Aber davon reden wir ja nicht.

                Da ich mit nem SQL Server 2000 unterwegs sein muß, kann es natürlich sein, daß ich eine Entwicklung verpasst habe. Deshalb hab ich mal neugierig gefragt.

                Ich erstelle eine Tabelle mit datum als date/time, frage select * from tabelle where datum = '05/oct/2010' und alles wird gut.

                Das wäre jedenfalls für MySQL kein gültiges Datumsliteral.

                Dat's true. Is für den MS SQL Server nicht das einzige Format, aber das von mir präferierte. Da gibts keine Missverständnisse. Ein Grund warum unsere Datumseingaben nur per JS Kalender funktionieren. Wenn man ein bestimmtes Datumsformat braucht, dann muss man den User dazu zwingen. Aufgrund verschiedener Sprachversionen unserer Office Installationen gibts schon genug Ärger mit verdrehten Daten. Schade Daß z.b. Excel erst beim 4.13.2010 merkt, daß der 13.4.2010 irgendwie sinnvoller ist. Dummerweise hat man bis dahin schön den 4.1.2010, 4.2.2010, 4.3.2010 ... 4.12.2010. Die uns zugeschickten / zum Download bereitgestellten Daten können wir leider nicht beeinflussen.

                --
                Vergesst Chuck Norris.
                Sponge Bob kann unter Wasser grillen!
  2. Moin Moin!

    Ich habe eine Tabelle Termine mit 2 Spalten: Start und Ende im Format jeweils "YYYY-MM-DD".

    Als String oder als Datumstyp?

    Nun hätte ich gern abgefragt alle Termine zB. Monat Oktober.
    Also Start >= Oktober <= Ende.

    select * from termine where

    start > '2010-10-00' and
    ende < '2010-11-00'

      
    Bist Du sicher, dass der Nullte Tag von MySQL verdaut wird und sich so verhält, wie Du es erwartest?  
      
    Bist Du sicher, dass start nie größer als ende ist?  
      
    Ich würde mit >= und <= arbeiten, und dabei den jeweils ersten und letzten Tag angeben, oder wahlweise das Datum in einen String umwandeln und mit substr arbeiten.  
      
    In Oracle sähe letzeres ungefähr so aus:  
      
    ~~~sql
      
    select  
      ...  
    from  
      ...  
    where  
      to_char(start,'YYYY-MM')='2010-10'  
      and  
      to_char(ende,'YYYY-MM')='2010-10'  
    
    

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    1. Hi!

      Bist Du sicher, dass der Nullte Tag von MySQL verdaut wird und sich so verhält, wie Du es erwartest?

      MySQL lässt (in Datumsspalten) als Monat und/oder Tag auch den Wert 0 zu. Das kann man verwenden, wenn beispielsweise nur der Monat bekannt ist, aber nicht der genaue Tag. 1 oder Ultimo wären ungeeignet, weil das ja auch ganz legale Werte sein können. Mit diesen 0-Werten, so sagt das Handbuch, darf man nur nicht rechnen und exakte Ergebnisse haben wollen. (Dieses Verhalten lässt sich über den SQL-Mode NO_ZERO_IN_DATE auch ausschalten.)

      Lo!

  3. Hi!

    Ich habe eine Tabelle Termine mit 2 Spalten: Start und Ende im Format jeweils "YYYY-MM-DD".

    Wichtig wäre zu wissen, ob es eine Spalte vom Typ DATE ist oder VARCHAR. Aber wenn du Format sprichst, kannst du eigentlich nur VARCHAR gemeint haben, denn Datums- und Zeitwerte haben ein internes Format, das du nicht beinflussen kannst.

    Nun hätte ich gern abgefragt alle Termine zB. Monat Oktober.

    select * from termine where

    start > '2010-10-00' and
    ende < '2010-11-00'

      
    Und was genau geht da bei dir nicht? Ich habe weder bei Abfragen mit DATE- noch mit VARCHAR-Spalten ein Problem feststellen können.  
      
    
    > Ich habe schon viele Verschiedene Möglichkeiten probiert, aber es scheint als ob AND dabei zu OR wird.  
      
    Wie genau äußert sich das? Bei welchen Daten kommt welches Ergebnis raus? Was wird gefunden, soll aber nicht, und was wird nicht gefunden, soll aber.  
      
      
    Lo!