C# and SQL Server 2005
本文关键字:2005 Server SQL and | 更新日期: 2023-09-27 18:19:28
我有4个表,从中提取记录。前三个表需要和公共行进行内部联接,但对于第四个表,我需要左外部联接,因为我必须保留前三个表格中已经提取的行。
现在,问题是我想左联接第四个表,但它应该只选择日期=当前日期的记录。在调用存储过程时,我正在从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
我使用和和左外部联接,因为我想要这样的记录,其中as使用where子句过滤整个结果,只给我一条记录。
然后我在存储过程中使用了带有两个日期的casting,但没有正面响应。
从C#我正在使用
var date = datetime.now.toshortdate();
CallStoredProcedure(date)
请尽快帮我。感谢
首先,您应该为日期使用适当的类型,即DATETIME
-如果可以避免,请不要将日期转换为字符串并返回!
其次:SQL Server中的DATETIME
和.NET中的DateTime
都有日期和时间信息,例如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
的时间部分,然后将在仅日期进行比较(不涉及时间)。更新到SQLServer2008或更新版本后,我建议您使用DATE
数据类型,它正是为此而设计的—只存储日期(无时间)。遗憾的是,这在SQLServer2005中还不可用。
此外,从C#-使用此行调用您的存储过程:
var date = Datetime.Today;
CallStoredProcedure(date);