Announcement

Collapse
No announcement yet.

Den Datensatz zum nächsten Datum abfragen ???

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Den Datensatz zum nächsten Datum abfragen ???

    Hallo,

    ich habe folgendes Problem und komme einfach nicht weiter:

    Ich habe eine Tabelle Time mit den selektierten Spalten Year, Quarter, Period, und Day.

    Bsp zum Inhalt der Tabelle Time:

    ERSTER DATENSATZ: Year: 2008, Quarter: Q4, Period: P12, Day: 30.09.2008
    ZWEITER DATENSATZ:Year: 2009, Quarter: Q1, Period: P1, Day: 01.10.2008
    DRITTER DATENSATZ: Year: 2009, Quarter: Q1, Period: P1, Day: 02.10.2008

    -> das Attribut Day ist immer eindeutig!
    mir ist ein Day (Datum) bekannt z.B. 30.09.2008 und möchte aus der Tabelle den Datensatz zum unmittelbar nächsten Day ermitteln (also in dem FAll alles zum 1.10.2008) -> habe nur leider keine ahnung wie das geht.

    SQL STATEMENT:

    SELECT DISTINCT [Year], [Quarter], [Period], [Day]
    FROM Time
    WHERE Day = ?????

  • #2
    Hallo vanilla83,

    wenn die Tabelle vollständig mit allen Tagen gefüllt ist, braucht man ja eigentlich nicht selektiert, das kann der Client auch ausrechnen.
    Brauchst Du den Datensatz anderweitig, na dann rechne einen Tag drauf und selektiere damit:
    [highlight=SQL]SELECT DISTINCT [Year], [Quarter], [Period], [Day]
    FROM Time
    WHERE Day = DATEADD(dd, 1, GetDate())
    [/highlight]

    So ging es auch, insbesondere wenn die Tabelle nicht vollständig ist, ist aber nicht so performant:
    "Liefere mir das erste auftretende Datum, das echt-größer als das Ausgangsdatum ist, nach Datum sortiert".
    [highlight=SQL]
    SELECT TOP 1 [Year], [Quarter], [Period], [Day]
    FROM Time
    WHERE Day > GetDate()
    ORDER BY DAY[/highlight]

    Syntax/Funktionen sind vom MSSQL, GetDate() nur als Beispieldatum gedacht
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Hallo O.Helper,

      vielen Dank erstmal für deine Antwort.

      getDate() gibt mir aber das aktuellste Datum zurück ich möchte von einem bestimmten Datum (nicht unbedingt vom heutigen) ausgehen.

      P.S. die Tabelle ist vollständig mit allen Tagen gefülllt

      Comment


      • #4
        Deswegen schrieb ich extra:
        GetDate() nur als Beispieldatum gedacht
        Wenn Du es für ein bestimmtes Datum hast, muss Du es "nur" angeben; "nur" weil manche sich mit dem Datum schwer tun.
        Tip: Ein landes-unabhängiges Format nutzen, also eines der erste 2.

        [highlight=SQL]WHERE Day = DATEADD(dd, 1, {d N'2008-06-05'})
        WHERE Day = DATEADD(dd, 1, CONVERT(datetime, '20080605')
        WHERE Day = DATEADD(dd, 1, CONVERT(datetime, '05.06.2008', 104)
        [/highlight]
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          SELECT DISTINCT [Year], [Quarter], [Period], [Tag]
          FROM Time
          WHERE abs(datediff(day,Tag,'1.1.2009'))=
          (select min(abs(datediff(day,Tag,'1.1.2009'))) from Time)

          anbei ein Beispiel für das Vergleichsdatum 1.1.2009.
          Das Feld Day habe ich umbenannt um nicht mit dem 'Day' aus der Funktion in Konflikt zu geraten. Das Ganze funktioniert auf SQL-Server 2005.

          Gruß
          docendo discimus

          Comment


          • #6
            okay vielen dank!!!

            Comment


            • #7
              Hallo frauwue,

              kleine Anmerkung, durch Verwenden einer Funktion auf das Feld im WHERE wird nie ein Index verwendet, bei großen Datenmenge (was Datumswerte eher nicht sind), wäre es sehr inperformant

              WHERE Feld + 1 = 5
              nutzt nie einen Index

              WHERE Feld = 4
              schon
              Olaf Helper

              <Blog> <Xing>
              * cogito ergo sum * errare humanum est * quote erat demonstrandum *
              Wenn ich denke, ist das ein Fehler und das beweise ich täglich

              Comment

              Working...
              X