2014-11-08 1 views
0

У меня следующие записи в БД ниже - это дата создания каждой записи.SQL-запрос, запрашивающий базу данных между двумя датами

2013-11-09 12: 55: 43,000
2013-10-29 19: 01: 53,000
2013-10-29 04: 59: 42,000

Мой SQL-запрос выглядит следующим образом

Select d.Name as DealerName, Sum(c.CommissionAmount) as CommissionAmount 
from Dealer d 
Left join Commission c on c.Dealerid = d.DealerId 
where c.CreatedDate between isnull(@FromDate, c.CreatedDate) and isnull(@ToDate, c.CreatedDate) 
Group by d.Name 
Order by CommissionAmount desc 

Когда я вхожу следующие даты в моей функции поиска

с даты = 29/10/2013
на сегодняшний день = 09/11/2013

Это возвращает только одну запись, когда он должен вернуть три, но если я уйду от даты, как это и передать в нуль на К настоящему времени я получаю две записи назад

Может кто-нибудь сказать мне, что я делаю Неправильно здесь?

Благодаря

ответ

0

Попробуйте это:

Когда Вы используете Dates в where положение Всегда используйте Same отливку с обеих сторон

Select d.Name as DealerName, Sum(c.CommissionAmount) as CommissionAmount 
from Dealer d 
Left join Commission c on c.Dealerid = d.DealerId 
where CAST(c.CreatedDate as DATE) between 
CAST(isnull(@FromDate, c.CreatedDate) as DATE) and 
CAST(isnull(@ToDate, c.CreatedDate) as DATE) 
Group by d.Name 
Order by CommissionAmount desc 
+0

Я попробовал ваши объявить FromDate DATETIME = '29/10/2013' , Todate DateTime = '09/11/2013 ' Выберите d.Name как имя дилера, сумма (c.CommissionAmount) как Co mmissionAmount от дилера д левое соединение комиссии с на c.Dealerid = d.DealerId , где CAST (c.CreatedDate, как DATE) между CAST (IsNull (FromDate, c.CreatedDate) в качестве даты) и CAST (IsNull (Todate , c.CreatedDate), как DATE) группы по d.Name Сортировать по CommissionAmount алфавита , но я получаю следующее сообщение об ошибке преобразования типа VARCHAR данных в тип данных даты и времени привело к значению вне-диапазона. нужно удалить «@» из переменных –

0

Проблема у определили переменные без времени Таким образом, @todate будет как '2013-11-09 00:00:00.000'.

Но в таблице дата имеет время. Между оператором не будет учитываться эта дата '2013-11-09 12:55:43.000', так как она выше, чем дата, когда вы упомянули, что вы получаете две строки.

поэтому попробуйте это.

CREATE TABLE #temp 
    (dates DATETIME) 

INSERT INTO #temp 
VALUES  ('2013-11-09 12:55:43.000'), 
      ('2013-10-29 19:01:53.000'), 
      ('2013-10-29 04:59:42.000') 


DECLARE @from VARCHAR(50)='29/10/2013', 
     @to VARCHAR(50) ='09/11/2013' 

SELECT * 
FROM #temp 
WHERE (@from is not null and @to is not null and Cast(dates AS DATE) BETWEEN CONVERT(DATE, @from, 103) AND CONVERT(DATE, @to, 103)) or 1=1 

SQL FIDDLE DEMO

+0

Я до сих пор не получаю три строки, я прохожу в формате dd/mm/yyyy, а не dd-mm-yyyy, как 09/11/2013 00:00:00 и 29/10/2013 00:00:00 –

+0

Как я проходил в формате dd/mm/yyyy, и ваш пример показывает его в формате yyyy-mm-dd. Мне нужно изменить формат моих значений в соответствии с вашим, как я могу это сделать ? –

+0

@ScottAtkinson - попробуйте сейчас обновить –

0

Вы можете сделать это с помощью буксировать способами один является

1. CAST

CAST(c.CreatedDate as DATE) 

2. CONVERT

CONVERT(varchar(10), c.CreatedDate) 

Вот эти способы, которыми вы можете достичь.

1. where 
    CONVERT(varchar(10), c.CreatedDate) 
    between 
    isnull(@FromDate, c.CreatedDate) 
    and 
    isnull(@ToDate, c.CreatedDate) 


2. where 
    CAST(c.CreatedDate as DATE) 
    between 
    isnull(@FromDate, c.CreatedDate) 
    and 
    isnull(@ToDate, c.CreatedDate) 

Разница между литым & обращенным является Вы можете применять любой формат стиль вам нужно в CONVERT функции .Есть много времени формата даты Availabe для CONVErT функции Refer ссылкой вы получите весь формат styple в SQL.

Синтаксиса для Новообращённого

CONVERT (data_type [ (length) ] , expression [ , style ]) 

где expression [ , style ] это необязательное поле.

CAST:

В ролях доступны после версии SQL 2005. гипса также Преобразует выражение одного типа данных в другой в SQL Server. Синтаксис

CAST (expression AS data_type [ (length) ]) 

[ (length) ] является необязательное поле в ролях

0

Try This

SELECT  d.Name as DealerName, Sum(c.CommissionAmount) as CommissionAmount 
    FROM  Dealer d 
    LEFT JOIN Commission c on c.Dealerid = d.DealerId 
    WHERE  CONVERT(VARCHAR(10),CAST(c.CreatedDate AS DATE),103) 
       BETWEEN isnull(@FromDate, c.CreatedDate) and isnull(@ToDate, c.CreatedDate) 
    Group by d.Name 
    Order by CommissionAmount desc 
Смежные вопросы