2012-06-12 2 views
1

У меня есть этот запрос,Дата между - SQL Server 2008 - ASP.net

WITH NumberedRows AS 
(
    SELECT Serial, 
      DateReceived, 
      DeviceLevel, 
      ROW_NUMBER() OVER (ORDER BY DateReceived) AS RowNumber 
    FROM TBLReadings 
) 
SELECT * 
FROM NumberedRows 
WHERE RowNumber % 5 = 1 and Serial like '+447584996153' 

мне нужно искать между датой - последние 7 дней. Я знаю поиск ..

WHERE DateReceived BETWEEN 'blahblah' and 'blahblah' 

Но какова функция? Я пробовал разные форматы, чтобы назвать дату конкретно.

Текущие данные извлекают дату в формате dd/mm/yyyy 00:00:00.

Я не знаю, как правильно использовать функции для даты в поиске (я предполагаю, что это, почему я не могу получить какие-либо данные при поиске между датами, как я только показываю имя Col и нет данных)

+0

Планируете ли вы передавать значения даты в качестве параметров для запрос? – Thomas

+0

Да, am @Thomas – Brobina

ответ

1

Попытайтесь использовать функцию DATEADD для получения данных за последние семь дней:

WHERE DateReceived > DATEADD(day,-7, getutcdate()) 

или

WHERE DateReceived > DATEADD(day,-7, GETDATE()) 
1

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

Select Convert(varchar(12),GetDate(),112) это вернет дату в формате YYyyMmDd

Таким образом, в случае запроса может быть WHERE Convert(varchar(12,DateReceived,112) BETWEEN Convert(varchar(12,DateFrom,112) and Convert(varchar(12,DateTo,112)

2

Если ваши даты имеют DATE или DATETIME типа данных, вы можете просто использовать:

WHERE DateReceived >= '20120601'   --- at or after the 1st of June 
    AND DateReceived < '20120608'    --- and before the 8th of June 
1

Если вы планируете при переходе значения даты в качестве параметров запроса, то вы можете просто позволить .NET обрабатывать снимание время:

WITH NumberedRows AS 
(
    SELECT Serial, 
      DateReceived, 
      DeviceLevel, 
      ROW_NUMBER() OVER (ORDER BY DateReceived) AS RowNumber 
    FROM TBLReadings 
    Where DateReceived >= @Date1 
     And DateReceived < DateAdd(d,8,@Date1) 
) 
SELECT * 
FROM NumberedRows 
WHERE RowNumber % 5 = 1 and Serial like '+447584996153' 

В вашей .NET код, в котором вы передаете значения даты, вы просто использовали бы свойство объекта DateTime, чтобы передать только прошедшую дату .:

myCommandVar.AddParameterWithValue(myDateVar.Date); 

Другой вариант, если вы хотите всегда использовать сегодняшнюю дату, и вы не хотите, чтобы передать параметр будет что-то вроде этого:

Where DateReceived >= DateAdd(d, DateDiff(d, 0, CURRENT_TIMESTAMP), 0) 
     And DateReceived < DateAdd(d, DateDiff(d, 0, CURRENT_TIMESTAMP), 8) 

В этом случае, я зачистки времени часть из текущую дату и время, вычислив количество дней с даты 0 и затем добавив это число дней до 0. Обратите внимание, что во второй части я начал с даты 8.

+0

Каков наилучший способ использования параметров? Значение по умолчанию? или? – Brobina

+0

@OliverBush - лучший способ - это тот, который лучше всего подходит для проблемы;). Трудно ответить на вопрос без каких-либо подробностей, однако в целом вы не хотите использовать конкатенацию для построения строки SQL в вашем коде ASP.NET. Вместо этого вы захотите, чтобы ваш оператор SQL был несколько статическим (часто постоянным) с параметрами, которые вы передаете в объект Command. – Thomas

+0

@OliverBush - Если вы спрашиваете о том, как обрабатывать возможность того, что DateReceived является нулевым, и вы хотите, чтобы строки, где это верно, возвращались, тогда вы изменили бы оператор Where на 'Where DateReceived Is Null Or (DateReceived> = @Date And DateReceived Thomas