C# C和SQL Server 2005

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

我有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
我使用了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关于错误处理日期的这篇博文:-您不应该将日期存储为字符串-您这样做只是自找麻烦。使用日期或日期时间数据类型!非常感谢您抽出宝贵的时间。