C# C和SQL Server 2005
我有4个表从中获取记录。前三个表需要与公共行进行内部连接,但对于第四个表,我需要左外部连接,因为我必须保留前三个表中已经获取的行 现在的问题是,我希望左连接第四个表,但它应该只选择日期=当前日期的记录。调用存储过程时,我正在从C传递当前日期。但问题是SQL Server正在提供空记录 以下是查询::C# C和SQL Server 2005,c#,asp.net,sql-server-2005,asp.net-mvc-4,rdbms,C#,Asp.net,Sql Server 2005,Asp.net Mvc 4,Rdbms,我有4个表从中获取记录。前三个表需要与公共行进行内部连接,但对于第四个表,我需要左外部连接,因为我必须保留前三个表中已经获取的行 现在的问题是,我希望左连接第四个表,但它应该只选择日期=当前日期的记录。调用存储过程时,我正在从C传递当前日期。但问题是SQL Server正在提供空记录 以下是查询:: alter procedure (@currentdate varchar(50)) select distinct table1.name, table2.class,tab
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
我使用了and和left outer join,因为我需要这样的记录,where as using where子句过滤整个结果,只给我一条记录
然后我在存储过程中使用了两个日期的强制转换,但没有正面响应
我用的是C语言
var date = datetime.now.toshortdate();
CallStoredProcedure(date)
请尽快帮我解决这个问题。谢谢你首先-你应该为你的日期使用合适的类型-即DATETIME-如果你可以避免的话,不要将日期转换成字符串并返回!在这里你绝对可以避免 其次:SQL Server中的DATETIME和.NET中的DATETIME都有日期和时间信息,例如2013-06-23 14:57:34,因此,如果在联接条件中进行相等比较,则只会选择与日期和时间完全匹配的行。因此,如果只想使用日期进行比较,就需要去掉时间部分 因此,请尝试以下代码:
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 2008或更高版本后,我建议使用专门为此设计的日期数据类型—只存储日期而不存储时间。不幸的是,这在SQLServer2005中还不可用
另外,从C-使用此行调用存储过程:
var date = Datetime.Today;
CallStoredProcedure(date);
您不应该使用varchar50作为日期的数据类型!从不使用适当的类型-例如DateTimes请参阅Aaron Bertrand关于错误处理日期的这篇博文:-您不应该将日期存储为字符串-您这样做只是自找麻烦。使用日期或日期时间数据类型!非常感谢您抽出宝贵的时间。