1

我有 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

我使用了左外连接,因为我希望使用 where 子句过滤整个结果并只给我一条记录的方式记录。

然后我也在存储过程中使用了两个日期的转换,但没有积极的回应。

从 C# 我正在使用

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

请尽快帮助我解决这个问题。谢谢

4

1 回答 1

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 2008或更高版本,我建议使用DATE专门为此设计的数据类型 - 仅存储日期(没有时间)。不幸的是,这在 SQL Server 2005中尚不可用。

此外,从 C# - 使用这一行来调用您的存储过程:

var date = Datetime.Today;
CallStoredProcedure(date);
于 2013-06-23T07:00:34.367 回答