none
Differenz zwischen Datum und heute in Tagen RRS feed

  • Frage

  • Hallo zusammen,

    wie schon in der Überschrift erkennbar, möchte ich in einer WHERE-Klausel die Differenz zwischen einem Datum und heute in Tagen berechnen und mit einer Bedingung überprüfen.

    Mein Ansatz bis jetzt:

    WHERE CAST(DATEDIFF(d, rtcdyn.dbo.HomedResourceDynamic.LastNewRegisterTime, CURRENT_TIMESTAMP) AS INTEGER) >= 60

    Bringt mir aber einen Syntax-Error....was mach ich falsch?

    Mittwoch, 6. November 2013 07:32

Antworten

  • Ok, jetzt ist es mir selber aufgefallen...das WHERE muss nach das INNER JOIN

    Kopf -> Tisch...danke trotzdem für die Hilfe :-)

    Mittwoch, 6. November 2013 08:26

Alle Antworten

  • Hallo zusammen,

    wie schon in der Überschrift erkennbar, möchte ich in einer WHERE-Klausel die Differenz zwischen einem Datum und heute in Tagen berechnen und mit einer Bedingung überprüfen.

    Mein Ansatz bis jetzt:

    WHERE CAST(DATEDIFF(d, rtcdyn.dbo.HomedResourceDynamic.LastNewRegisterTime, CURRENT_TIMESTAMP) AS INTEGER) >= 60

    Bringt mir aber einen Syntax-Error....was mach ich falsch?

    Im SQL Server heisst der datentyp schlicht int

    Nicht INTEGER

    Nebenbei solltest Du nicht unnötig mit 4-part Names arbeiten, wo auch 2-part ausreicht. - Das kann ich zwar hier nicht beurteilen, die Chancen, dass das so nötig ist, sind aber gering.

    Außerdem sollte Dir bewusst sein, das es wirklich nur die Differenz in Tagen ist. Wenn es weniger als 24 Std sind, bedeutet das auch 0 Tage. Ob das für Dich so richtig ist, kann ich auch nicht beurteilen, nur um sicherzustellen, das Dir das bewusst ist also.


    Andreas Wolter | Microsoft Certified Master SQL Server

    Blog: www.insidesql.org/blogs/andreaswolter
    Web: www.andreas-wolter.com | www.SarpedonQualityLab.com

    Mittwoch, 6. November 2013 08:13
  • Hallo,

    grundsätzlich wäre der Ausdruck zulässig, auch wenn der zusätzlichE CAST nicht erforderlich ist, da DATEDIFF bereits einen Integer (hier Tage) liefert.

    So kann man nur vermuten das

    rtcdyn.dbo.HomedResourceDynamic.LastNewRegisterTime

    nicht verfügbar ist. Dort sollte ein Verweis auf eine Tabellenspalte stehen - vorzugsweise sollte sich die Tabelle auch vorausgehenden der FROM Klausel (nicht gezeigt) finden.

    Gruß Elmar

    Mittwoch, 6. November 2013 08:15
    Beantworter
  • Die Tabellennamen sind so vorgegeben, sind Tabellen, die einem OCS-Server gehören.

    Hier mal das ganze Statement:

    USE rtcdyn
    SELECT rtc.dbo.Resource.UserAtHost, rtcdyn.dbo.HomedResourceDynamic.LastNewRegisterTime
    FROM rtcdyn.dbo.HomedResourceDynamic
    WHERE DATEDIFF(d, rtcdyn.dbo.HomedResourceDynamic.LastNewRegisterTime, CURRENT_TIMESTAMP) >= 60
    INNER JOIN rtc.dbo.Resource ON rtc.dbo.Resource.ResourceId = rtcdyn.dbo.HomedResourceDynamic.OwnerId
    ORDER BY UserAtHost

    Genaue Fehlermeldung:

    Msg 156, Level 15, State 1, Line 5
    Incorrect syntax near the keyword 'INNER'.


    Statement ohne WHERE funktioniert
    • Bearbeitet Orothred Mittwoch, 6. November 2013 08:19
    Mittwoch, 6. November 2013 08:18
  • Ok, jetzt ist es mir selber aufgefallen...das WHERE muss nach das INNER JOIN

    Kopf -> Tisch...danke trotzdem für die Hilfe :-)

    Mittwoch, 6. November 2013 08:26
  • Die Tabellennamen sind so vorgegeben, sind Tabellen, die einem OCS-Server gehören.

    Hier mal das ganze Statement:

    USE rtcdyn
    SELECT rtc.dbo.Resource.UserAtHost, rtcdyn.dbo.HomedResourceDynamic.LastNewRegisterTime
    FROM rtcdyn.dbo.HomedResourceDynamic
    WHERE DATEDIFF(d, rtcdyn.dbo.HomedResourceDynamic.LastNewRegisterTime, CURRENT_TIMESTAMP) >= 60
    INNER JOIN rtc.dbo.Resource ON rtc.dbo.Resource.ResourceId = rtcdyn.dbo.HomedResourceDynamic.OwnerId
    ORDER BY UserAtHost

    Genaue Fehlermeldung:

    Msg 156, Level 15, State 1, Line 5
    Incorrect syntax near the keyword 'INNER'.


    Statement ohne WHERE funktioniert

    Die WHERE-Klausel kommt nach FROM und den JOINs

    und 4-part names in den Spalten sind sicherlich nicht notwendig ;-)

    Wie auch immer, ist nur ein Tipp, um Code lesbarer und auch weniger anfällig für Fehler zu halten


    Andreas Wolter | Microsoft Certified Master SQL Server

    Blog: www.insidesql.org/blogs/andreaswolter
    Web: www.andreas-wolter.com | www.SarpedonQualityLab.com

    Mittwoch, 6. November 2013 08:27
  • Hallo,

    Du hast die Reihenfolge vertauscht. WHERE kommt erst nach allen Tabellen (FROM, JOIN usw).

    Damit es lesbarer wird, solltest Du dir den Gebrauch von Tabellen-Aliasnamen angewöhnen:

    USE rtcdyn;
    
    SELECT r.UserAtHost,
    	hrd.LastNewRegisterTime
    FROM rtcdyn.dbo.HomedResourceDynamic AS hrd
    INNER JOIN rtc.dbo.Resource AS r ON r.ResourceId = hrd.OwnerId
    WHERE DATEDIFF(d, hrd.LastNewRegisterTime, CURRENT_TIMESTAMP) >= 60
    ORDER BY UserAtHost;

    Gruß Elmar

    Mittwoch, 6. November 2013 08:27
    Beantworter
  • Wie schon gesagt, die Namen kommen so vom OCS-Server, der erstellt die Tabellen und arbeitet damit. Microsoft´s Schuld, nicht meine :-)

    Aliases werden natürlich noch eingebaut

    Mittwoch, 6. November 2013 08:32
  • Wie schon gesagt, die Namen kommen so vom OCS-Server, der erstellt die Tabellen und arbeitet damit. Microsoft´s Schuld, nicht meine :-)

    Aliases werden natürlich noch eingebaut

    An de Namen als solches stört sich sicherlich keiner ;)

    Aliasing ist schon mal eine Methode. Ob ein-buchstabige Aliase jetzt Code verständlicher machen, ist sicherlich Geschmackssache ;)

    Aber das Ziel ist klar.

    Auch Synonyme können helfen - gerade wenn man viel auf diese Tabellen zugreift.


    Andreas Wolter | Microsoft Certified Master SQL Server

    Blog: www.insidesql.org/blogs/andreaswolter
    Web: www.andreas-wolter.com | www.SarpedonQualityLab.com

    Mittwoch, 6. November 2013 08:38
  • Noch ein Hinweis am Rande: Dadurch das Du eine Funktion auf eine Spalte anwendest, kann hier nie ein Index verwendet werden, was auf die Performanz geht. Du kannst die Bedingung aber einfach umschreiben

    SELECT rtc.dbo.Resource.UserAtHost, rtcdyn.dbo.HomedResourceDynamic.LastNewRegisterTime
    FROM rtcdyn.dbo.HomedResourceDynamic
         INNER JOIN 
         rtc.dbo.Resource ON rtc.dbo.Resource.ResourceId = rtcdyn.dbo.HomedResourceDynamic.OwnerId
    WHERE rtcdyn.dbo.HomedResourceDynamic.LastNewRegisterTime >= DATEADD(d, -60, CURRENT_TIMESTAMP)

    spricht: Alle Datensätze, wo das Datum größer-gleich heute abzüglich 60 Tage ist; das erhöht die Chance, das ein Index (sofern überhaupt vorhanden) verwendet wird.

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 6. November 2013 09:24