2013-06-23 2 views
1

У меня есть 4 таблицы, из которых я извлекаю записи. Первые три таблицы требуют внутреннего соединения с общими строками, но с 4-й таблицей мне нужно оставить внешнее соединение, потому что я должен сохранить уже взятые строки из первых трех таблиц.C# и SQL Server 2005

Теперь проблема в том, что я хочу, чтобы левое соединение с четвертой таблицей, но оно должно выбирать только записи, имеющие дату = текущую дату. Я передаю текущую дату из C# при вызове моей хранимой процедуры. Но дело в том, что SQL Server дает нулевые записи.

Вот запрос ::

alter procedure 
    (@currentdate varchar(50)) 
    select distinct 
     table1.name, table2.class,table3.stream 
    from 
     table1 
    inner join 
     table 2 on table1.id = table2.id 
    inner join 
     table3 on table3.id=table2.id 
    left outer join 
     table 4 on table 4.id = table3.id and table4.date = @currentdate 

я и левое внешнее соединение, потому что я хочу записи в том, как, где, как, используя, где положение фильтрует весь результат и просто дать мне одну запись.

Затем я также использовал литье с обеими датами в хранимой процедуре, но без положительного ответа.

От C# Я использую

var date = datetime.now.toshortdate(); 
CallStoredProcedure(date) 

Пожалуйста, помогите мне об этом как можно скорее. Спасибо

+0

Вы должны ** НЕ ** использовать 'VARCHAR (50)', как тип данных для даты! **НИКОГДА** ! Используйте соответствующие типы - например. 'DATETIME' –

+0

См. Это сообщение в блоге Аарона Бертранна о датах неправильного обращения: [Плохие привычки: неправильные обращения/заданные вопросы] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/ bad-habitits-to-kick-mishandling-date-range-queries.aspx) - вы должны ** не ** хранить даты как строки - вы просто просите о проблемах таким образом. Используйте типы данных DATE или DATETIME! –

ответ

0

Прежде всего - вы должны использовать тип соответствующего для вашей даты - это DATETIME - делать не дату броска в строки и обратно, если вы можете избежать этого! (и вы определенно можете избежать этого здесь)

Во-вторых: DATETIME в SQL Server, а также DateTime в .NET имеют даты и информацию о времени, например. 2013-06-23 14:57:34, поэтому, если вы выполняете сравнение равенства в своем JOIN-состоянии, будут выбраны только те строки, которые точно соответствуют вашей дате и времени. Поэтому вам нужно снять временную часть, если вы хотите использовать только даты для сравнения.

Так попробуйте этот код здесь:

ALTER PROCEDURE dbo.YourProcedureNameHere (@currentdate DATETIME) 
    SELECT DISTINCT 
     table1.name, table2.class, table3.stream 
    FROM 
     dbo.table1 
    INNER JOIN 
     dbo.table2 ON table1.id = table2.id 
    INNER JOIN 
     dbo.table3 ON table3.id = table2.id 
    LEFT OUTER JOIN 
     table 4 ON table 4.id = table3.id 
       AND DATEADD(DAY, DATEDIFF(DAY, 0, table4.date), 0) = 
        DATEADD(DAY, DATEDIFF(DAY, 0, @currentdate), 0) 

Это отсекает время часть вашего table4.date, а также @currentdate и то сравнение будет сделано на только дату (нет времени участвовать). После того, как вы обновились до SQL Server или новее, я бы рекомендовал использовать тип данных DATE, который был разработан именно для этого - хранение только даты (нет времени). К сожалению, это еще не доступно в SQL Server .

Кроме того, из C# - использовать эту линию для вызова хранимой процедуры:

var date = Datetime.Today; 
CallStoredProcedure(date); 
+0

Большое спасибо за то, что вы дали свое драгоценное время. –