Frage

Ich möchte einen Bericht begrenzen Datensätze zurück von Datum A bis dieses Datum B. ist das, was ich getan habe:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'
-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date between @startDate and @endDate

... die ich zurückgegebenen Datensätze von 12 Uhr 1. JANUAR bis 23.59 Uhr 31. März gesagt wurde (das Mitternacht ist die Standardeinstellung, wenn keine Zeit angegeben wurde). Aber bemerkte ich eine Diskrepanz, das ist, wenn ein Datensatz eine Zeit von 0.00.00 hat, dass es Teil dieses Satzes sein wird.

Gibt es eine genaue Art und Weise, dies zu tun, so kehrt es genau den Datumsbereich ich will? *

Ich habe versucht, Zeit mit:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008 00:00:00'
set @endDate = '04/01/2008 11:59:59'
-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date between @startDate and @endDate

... aber ich bemerkte etwas wackelig: SQL Server werden die Hundertstel-Sekunden-Runde um die Hälfte nach oben. So bekomme ich, dass 1. April Rekord (ha! Aprilscherzes Rekord! Grr), wenn ich jederzeit benutzen später als 11.59.29. Warum das?

  • (Ich bin sicher, es gibt. Ich habe in diesem neu bin. Danke für Ihre Hilfe!)
War es hilfreich?

Lösung

Es gibt immer die einfache Option:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'

-- test what are the start and end dates
select min(date),max(date) from view_Inspections 
where date >= @startDate 
and   date < @endDate

Andere Tipps

Ich vermute, dass die Datumsspalte in view_Inspections ein Typ Smalldatetime-Daten sind. Dieser Datentyp hat 1 Minute Genauigkeit, die Ihre unerwarteten Ergebnisse (Abrunden die Sekunden auf die nächste Minute) erklärt.

Das Verfahren Roland Shaw schlägt vor, ist der beste Weg, um Ihre Anfrage zu verändern Ihren Anforderungen gerecht zu werden.

Der Operator BETWEEN ist inklusive, weshalb Sie die Ergebnisse sind zu sehen, die Sie in Ihrer ersten Abfrage sind. Die Rundung, die Sie in Ihrer zweiten Abfrage zu sehen ist los abhängig sein, welche genauer Datumsdatentyp Sie in Ihrer Tabelle verwenden. (Übrigens, ich glaube, Sie verwirrend Sekunden mit Hundertstelsekunden sind). Es sieht aus wie Sie wahrscheinlich ein small in Ihrer Tabelle verwenden, wobei in diesem Fall der Zeit, auf die nächste Minute aufgerundet wird.

Wenn Ihre Tabelle Datetime verwendet, versuchen Sie ausdrücklich Ihre @startDate und @endDate zu DATETIME- Werte (CAST (@endDate AS DATETIME-)) umgewandelt wird.

Eine kurze Notiz ... auch für DATETIME- Werte, ist SQL Server nur dann genau auf den 3 / 100stel einer Sekunde, so 11: 59: 00: 59.999 wird auf 12 aufgerundet erhalten. 00.000

Sie haben grundsätzlich drei Möglichkeiten:

1) zwischen CAST ('01 / 01/2008 00: 00: 00.000' AS DATETIME-) und gegossenes ('03 / 31/2008 12: 59: 59.997' AS DATETIME-)

2) YEAR (my_date) = 2008 und der Monat (my_date) zwischen 1 und 3

3) my_date> = CAST ('01 / 01/2008 00: 00: 00.000' AS DATETIME-) UND my_date

Die erste Methode ist nicht sehr intuitiv und fehleranfällig ist meiner Meinung nach. Die zweite Methode tötet Performance seit Indizes nicht verwendet werden kann, und es wird sehr viel komplexer, wenn Sie suchen haben können, die Jahre erstrecken oder beginnen / enden in der Mitte von Monaten. Die dritte Methode, der Rowland vorgeschlagen, ist das Beste, was ich denke.

Sie einfach versuchen, die Zeit aus dem Datumsfeld zu entfernen etwa so:

declare @startDate varchar(20)
declare @endDate varchar(20)
set @startDate = '01/01/2008'
set @endDate = '04/01/2008'

SELECT min(date),max(date) FROM view_Inspections 
WHERE CAST(FLOOR(CAST(date AS FLOAT)) AS DATETIME) BETWEEN CAST(@startDate AS DATETIME) And CAST(@startDate AS DATETIME))

Das wird alles von 01/01/2008 00:00:00 zu 04/01/2008 11:59:59.999 zurückzukehren. Wenn Sie enthalten nicht 04/01 möchten, Sie das Enddatum ändern 03/31/2008.

Ihre beste Lösung ist, erstellen Sie einfach eine BIGINT (10) Feld, das "julian", und speichern Sie es in YYYYMMDD genannt.

Sie dann die Abfrage wo julian> = '20120103' AND julian <= '20120203'

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top