SQL Date Search без времени - PullRequest
0 голосов
/ 14 февраля 2009

У меня есть запрос, который ищет по дате. даты в базе данных включают время. Как мне искать только по дате.

select * 
from weblogs.dbo.vwlogs 
where Log_time between @BeginDate and @EndDAte 
  and (client_user=@UserName or @UserName  Is null) 
order by Log_time desc

cmd.Parameters.AddWithValue("@BeginDate", txtBeginDate.Text);
cmd.Parameters.AddWithValue("@EndDAte", txtEndDate.Text);

Ответы [ 6 ]

3 голосов
/ 14 февраля 2009

Оставьте свой sql в основном как есть и просто исправьте свои параметры:

cmd.Parameters.Add("@BeginDate", SqlDbType.DateTime).Value =
    DateTime.Parse(txtBeginDate.Text).Date;       
cmd.Parameters.Add("@EndDAte", SqlDbType.DateTime).Value =
    // add one to make search inclusive
    DateTime.Parse(txtEndDate.Text).Date.AddDays(1);  

Вы также хотите сначала убедиться, что ваши текстовые поля являются действительными датами, но вы должны понять.

Единственное предостережение здесь состоит в том, что из-за причуды с оператором BETWEEN он будет соответствовать первому моменту следующего дня. Итак, чтобы исправить это мы пишем запрос так:

SELECT * 
FROM vwlogs 
WHERE Log_time >= @BeginDate AND Log_Time < @EndDate 
    AND (client_user=@UserName OR @UserName IS NULL) 
ORDER BY Log_time DESC

Обратите особое внимание на операторы сравнения вокруг даты.

1 голос
/ 14 февраля 2009

Первое, что нужно сделать, это удалить время из дат. Если вы хотите сделать это в коде сервера SQL, вы можете использовать что-то вроде кода ниже. У меня есть это как функция на всех базах данных, на которых я работаю

cast(floor(cast(@fromdate as float)) as datetime)

Следующая вещь, о которой нужно беспокоиться, это критерии где. Вы должны убедиться, что вы выбираете все от начала даты до конца даты. Вы также должны убедиться, что запросы на один день будут работать, что вы можете сделать с добавлением даты, например

Where LogTime >= @fromdate and LogTime < DateAdd(dd, 1, @todate)
1 голос
/ 14 февраля 2009

В SQL округляют начальную и конечную дату до целых дат и используют> = @BeginDate и очень конкретно <@EndDAte. Боюсь, процесс "округления" не очень элегантен </p>

например.

SELECT @BeginDate = DATEADD(Day, DATEDIFF(Day, 0, @BeginDate), 0),
       @EndDAte = DATEADD(Day, DATEDIFF(Day, 0, @EndDAte) + 1, 0)

select * 
from weblogs.dbo.vwlogs 
where     Log_time >= @BeginDate 
      and Log_time < @EndDAte
      and (@UserName Is null OR client_user=@UserName)
order by Log_time desc

Обратите внимание, что сначала я переместил "@UserName Is null", так как есть некоторые свидетельства того, что этот тест легко пройдет / не пройдёт и приведет к игнорированию второго теста с большей интенсивностью использования процессора (client_user = @ UserName), если первый тест - ИСТИНА (может, конечно, TommyRot ...)

Кроме того, для лучшей производительности вы должны явно назвать все нужные столбцы и не использовать «SELECT *» (но это могло быть только для целей этого вопроса)

0 голосов
/ 14 февраля 2009

Очистите даты, добавив следующую строку перед вашим запросом ...

select 
    @begindate=dateadd(day,datediff(day,0,@begindate),0),
    @enddate=dateadd(ms,-3,dateadd(day,datediff(day,0,@enddate),1))

Это будет этаж ваша дата начала до минимально возможного времени (00: 00: 00.000), а потолок ваша дата окончания до максимально возможного (23: 59: 59.997) , Затем вы можете сохранить свой запрос МЕЖДУ в точности так, как он был написан.

select * 
from weblogs.dbo.vwlogs 
where Log_time between @BeginDate and @EndDAte 
and (client_user=@UserName or @UserName Is null) 
order by Log_time desc

Надеюсь, это поможет.

0 голосов
/ 14 февраля 2009

Еще одна ошибка - усечение вашей даты окончания НЕ будет включать эту дату! Рассмотрим:

WHERE Log_Time> = @BeginDate AND Log_Time <@ EndDate </p>

Если @EndDate будет усечено, это будет полночь и ничего не совпадет в этот день. Вам нужно будет добавить день!

0 голосов
/ 14 февраля 2009

Если вы хотите изменить вместо этого sql,

TRUNC (Log_Time) будет уменьшать каждую дату / время до этой даты в полночь.

Убедитесь, что вы построили свой индекс для столбца как TRUNC (Log_TIME), чтобы его можно было использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...