Benutzer mit den meisten Antworten
Differenz zwischen Datum und heute in Tagen

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?
Antworten
-
Ok, jetzt ist es mir selber aufgefallen...das WHERE muss nach das INNER JOIN
Kopf -> Tisch...danke trotzdem für die Hilfe :-)
- Als Antwort markiert Ionut DumaModerator Montag, 11. November 2013 17:27
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 -
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
-
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
-
Ok, jetzt ist es mir selber aufgefallen...das WHERE muss nach das INNER JOIN
Kopf -> Tisch...danke trotzdem für die Hilfe :-)
- Als Antwort markiert Ionut DumaModerator Montag, 11. November 2013 17:27
-
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- Bearbeitet Andreas.WolterMicrosoft employee Mittwoch, 6. November 2013 08:28
-
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
-
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 -
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]