2016-12-09 2 views
2

Ich habe eine Spalte namens CrateDate, ich möchte Datensätze abrufen, deren CreateDate die letzten zwei Tage ist. Wie kann ich das machen? Mein gescheiterter Versuch ist dies:Datum Zeitintervall in SQL

SELECT COUNT (*) 
    FROM [MyDB].[dbo].[MyTable] WHERE City = 'Paris' AND CreateDate >= '2016-12-07' AND CreateDate <= '2016-12-10' 
+3

Mögliche Duplikat (http://stackoverflow.com/questions/6782999/find-records-from-previous-x-days) – 3N1GM4

Antwort

1

können Sie verwenden, um eine DATEADD() Funktion die Anzahl der Tage ab dem aktuellen Datum zu subtrahieren, dass viele Tage alte Daten zu erhalten:

SELECT COUNT(*) 
FROM MyTable 
WHERE City = 'Paris' 
    AND CreateDate BETWEEN DATEADD(DAY, -2, GETDATE()) AND GETDATE() 

Oder auch die einfacheren (funktioniert mindestens für 2008R2 und up), da Sie subtrahieren Tage sind:

SELECT COUNT(*) 
FROM MyTable 
WHERE City = 'Paris' 
    AND CreateDate BETWEEN GETDATE()-2 AND GETDATE() 

Wenn Sie eine feinere Intervall haben wollen, wie 40 Stunden, dann haben Sieverwenden, sonst können Sie sich an die implizite Subtraktion der Anzahl der Tage halten, die Sie von meiner zweiten Abfrage zurückgehen möchten.

2

Verwenden DATEADD 2 Tage nach dem aktuellen Datum zu subtrahieren und prüfen, ob Erstellungs-Datum zwischen diesem und dem heutigen Datum ist:

SELECT COUNT (*) 
    FROM [MyDB].[dbo].[MyTable] 
    WHERE City = 'Paris' AND CreateDate 
     BETWEEN DATEADD(DAY, -2, GETUTCDATE()) AND GETUTCDATE() 

Wenn Sie ganze Tage wollen (dh keine Zeitkomponente diese dann verwenden):

SELECT COUNT (*) 
    FROM [MyDB].[dbo].[MyTable] 
    WHERE City = 'Paris' AND CreateDate 
     BETWEEN dateadd(dd,0, datediff(dd,0,DATEADD(day, -2, GETUTCDATE()))) 
    AND DATEADD(s, -1, dateadd(dd,0, dateadd(dd,0, datediff(dd,0,DATEADD(day, 1, GETUTCDATE())))) 

Wenn das aktuelle Datum 09-Dec-2016 ist dann die where-Klausel der zweiten Abfrage erzeugen würde:

CreateDate BETWEEN 07-Dec-2016 00:00:00 and 09-Dec-2016 23:59:59 

Hinweis: Verwenden Sie GETDATE(), wenn Sie das Datum Zeiten in Ortszeit gespeichert sind oder GETUTCDATE() wenn in UTC gespeichert.

+0

Aus Neugier, warum UTC-Datum statt Server-Datum? – 3N1GM4

+2

@ 3N1GM4 Gewohnheit Ich speichere immer alle Daten in meinen Datenbanken in UTC - es macht die Dinge so viel einfacher, wenn Benutzer aus der ganzen Welt Daten in ihrer eigenen Zeitzone sehen wollen. – CSL

2

Sie können von DATEDIFF() und GETDATE()

SELECT COUNT (*) 
FROM [MyDB].[dbo].[MyTable] 
WHERE City = 'Paris' 
    AND DATEDIFF(DAY,CreateDate,GETDATE()) between 0 and 2 

machen Dieses prüft nur den Datumsteil von CreateDate und die Zeit ignorieren. (Das heißt, wenn Sie die Abfrage auf '2016-12-09 10:11' ausführen, wird es auch Daten erhalten mit CreateDate='2016-12-07 08:17'

1

Versuchen Sie, diese

SELECT COUNT (*) FROM [MyDB].[dbo].[MyTable] 
WHERE City = 'Paris' AND CreateDate >= dateadd(day,datediff(day,0,getdate()),-2) 
     AND CreateDate < dateadd(day,datediff(day,0,getdate()),1) 
1

dateadd() und getdate()

select count(*) 
from MyTable 
where City = 'Paris' 
and CreateDate between dateadd(dd,-2, getdate()) and getdate() 
1

diesen Versuchen.

select count(*) FROM [MyDB].[dbo].[MyTable] 
    WHERE City = 'Paris' 
    and CreateDate >= DATEADD(DAY, -2, GETDATE()) 
0

Wenn alle Datensätze in der gleichen Zeitzone mit Server gespeichert sind, so ist unten in OrdnungWenn nicht die entsprechende Zeitzone speichern, verwenden Sie die UTC vielleicht einen besseren Weg: [? Finden Aufzeichnungen aus früheren x Tage]

SELECT COUNT (*) 
FROM [MyDB].[dbo].[MyTable] 
WHERE City = 'Paris' AND CreateDate >= DATEADD(day, -2, GETUTCDATE()) 
0
select count(*) 
from MyTable 
where CreateDate between dateadd(dd,-2, getdate()) and getdate() and City = 'Paris'