Я храню события в SQLServer 2005, где время, когда произошло событие, важно и должно храниться в дате. Какой самый быстрый способ написать проверку диапазона дат в предложении where, чтобы все в этот день было выбрано?
В настоящее время, когда @DateStart и @DateEnd передаются, я устанавливаю @DateStart в полночь и устанавливаю @DateEnd в последний момент до полуночи, как самую первую вещь, чтобы поймать каждое возможное событие в тот же день.
Самый быстрый способ проверить диапазон дат
IF (@DateStart IS NOT NULL)
BEGIN
SET @DateStart = CAST (
( CAST (DATEPART (yyyy,@DateStart) AS NVARCHAR(4)) +'/'+
CAST (DATEPART (mm,@DateStart) AS NVARCHAR(2)) +'/'+
CAST (DATEPART (dd,@DateStart) AS NVARCHAR(2)) +' '+
'00:00:00.000'
)
AS DATETIME)
END
IF (@DateEnd IS NOT NULL)
BEGIN
SET @DateEnd = CAST (
( CAST (DATEPART (yyyy,@DateEnd) AS NVARCHAR(4)) +'/'+
CAST (DATEPART (mm,@DateEnd) AS NVARCHAR(2)) +'/'+
CAST (DATEPART (dd,@DateEnd) AS NVARCHAR(2)) +' '+
'23:59:59.997'
)
AS DATETIME
)
END
Так где положение очень легко читать:
WHERE (EVENTDATE> = @DateStart И EVENTDATE < = @DateEnd)
Спасибо,
Вместо того, чтобы поиграть с получением последнего момента до полуночи (сложно, поскольку MS SQL Server является точным до определенной точки, и это также делает этот код проблематичным для передачи на другую СУБД), почему бы вам просто не использовать EventDate <@DateEnd вместо «<=»? –
Всякий раз, когда вы хотите обрабатывать ведра диапазонов дат, подобных этому, предпочтительно использовать включенное условие на одной граничной и эксклюзивной с другой. То есть чище сказать <полуночи, а не <= полуночи-.003 секунды. – ahains