2009-03-11 2 views
1

Я использую управление календарем в asp.net. Он отображает только дату, а не время. Но при вставке в базу данных время вставлено автоматически. Но при извлечении данных из базы данных с использованием даты в том случае, когда условия не имеют соответствующих записей Показывает, какая модификация в хранимой процедуре я могу сделать, чтобы решить эту проблему.Calendar extender

Я использовал следующий код в storedprocedure.Name Из таблицы FileM

Select * из FileM Где OldDate = '@ OldDate%'

OldDate поле в databese это магазины, как даты и времени т.е. дата является датой я вставлено но время находится либо в 08: 00: 00: 000, либо 00: 00: 00: 000. Таким образом, в вышеуказанном запросе даются записи о дате, которая приходит со временем как 00: 00: 00: 000, но не с 08:00:00 : 000

ответ

2
-- assumes that the @OldDate parameter is a DATETIME 
SELECT * 
FROM FileM 
WHERE DATEDIFF(day, OldDate, @OldDate) = 0 

Если вы можете изменить хранимую процедуру, то у вас может быть больше гибкости и производительность при прохождении двух DATETIME параметров, с указанием начала и конца диапазона, что вам нужно:

CREATE PROCEDURE dbo.GetRangeOfRecords 
@StartDateTime DATETIME, 
@EndDateTime DATETIME 
AS 
SELECT * 
FROM FileM 
WHERE OldDate BETWEEN @StartDateTime AND @EndDateTime 

, а затем вызвать хранимую процедуру, как это, например:

EXEC dbo.GetRangeOfRecords 
    @StartDateTime = '2009-02-25 00:00:00.000', 
    @EndDateTime = '2009-02-25 23:59:59.999' 
0

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

DateAdd (d, DateDiff (d, 0, MyDateTimeColumn), 0)

так что вы можете использовать: -

Select * из FileM Где DateAdd (d, DateDiff (d, 0, OldDate), 0) = @OldDate

В качестве альтернативы, если вы используете SQL Server 2008, то является new date data type (без компонента времени).

+0

Вам лучше создать диапазон, отделив время от только вашего параметра и используя его для нижней границы и сделав его 11: 59: 59.997 для верхней границы (.999 раундов до полуночи следующей даты) , Таким образом, можно использовать индексы. Если вы измените значение столбца таблицы, SQL не может использовать индексы –

0

Пока ни одна из ваших дат явно не указана в компоненте времени, все они должны иметь значение по умолчанию: 00: 00: 00.000. В этом случае простое сравнение сравнений будет прекрасно. В вашем коде, однако, вы помещаете кавычки вокруг своего параметра, а это значит, что теперь вы сравниваете дату с литеральной строкой «@ OldDate%». Удалите кавычки и посмотрите, поможет ли это.

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

Смежные вопросы