减去日期

时间:2013-10-28 09:37:54

标签: sql sql-server

我有以下代码:

SELECT t2.Owner, a.accNumber, a.Rest, dateadd(day,1,MIN(a.Date)), MIN(b.Date)
  FROM t1 a
  LEFT JOIN t1 b ON a.accNumber=b.accNumber 
  LEFT JOIN t1 ON a.accountId = t2.accountId
  WHERE a.Date<b.Date 
    AND a.Rest<>0 
    AND a.accNumber=b.accNumber
  GROUP BY a.accNumber, a.Rest, t2.Owner
  ORDER BY t2.Owner

我想在第5列和第4列(MIN(b.Date) - dateadd(day,1,MIN(a.Date)))中减去日期并将其作为第6列,但由于LEFT JOIN,简单的DATEDIFF(day, dateadd(day,1,MIN(a.Date)), MIN(b.Date))不起作用。

enter image description here

它应该是这样的。使用当前代码,我只能看到前5列,我想看第6列

enter image description here

这是我将DATEDIFF(day, 4, 5)添加到Select语句

时的样子

2 个答案:

答案 0 :(得分:0)

在这种情况下,您应该使用ISNULL SQL Server的功能,因为NULL会使用LEFT JOIN

从你的问题来看,目前尚不清楚你想做什么,但可以这样使用:

ISNULL(MIN(a.Date), 0)

MIN(ISNULL(a.Date, 0))

参考:http://technet.microsoft.com/en-us/library/ms184325.aspx

答案 1 :(得分:0)

我不是100%肯定我理解这个问题,但我可以为你提供短期解决方案。这将让你继续开发,你可以在以后找出问题所在。

假设您发布的查询工作正常,正如您的评论所说,您可以将其视为表格。

您的查询是

SELECT t2.Owner, a.accNumber, a.Rest, dateadd(day,1,MIN(a.Date)), MIN(b.Date)
  FROM t1 a
  LEFT JOIN t1 b ON a.accNumber=b.accNumber 
  LEFT JOIN t1 ON a.accountId = t2.accountId
  WHERE a.Date<b.Date 
    AND a.Rest<>0 
    AND a.accNumber=b.accNumber
  GROUP BY a.accNumber, a.Rest, t2.Owner
  ORDER BY t2.Owner

为列命名,并将其包装在另一个SELECT语句中。这些方面的东西应该有效。

SELECT Owner, accNumber, Rest, Good_name, Another_good_name, 
       Another_good_name - Good_name Yet_a_third_good_name
FROM
    (SELECT t2.Owner, a.accNumber, a.Rest, 
            dateadd(day,1,MIN(a.Date)) Good_name, MIN(b.Date) Another_good_name
     FROM t1 a
     LEFT JOIN t1 b ON a.accNumber=b.accNumber 
     LEFT JOIN t1 ON a.accountId = t2.accountId
     WHERE a.Date<b.Date 
       AND a.Rest<>0 
       AND a.accNumber=b.accNumber
     GROUP BY a.accNumber, a.Rest, t2.Owner
     ORDER BY t2.Owner) AS Good_table_name

另一种方法是从第一个查询创建一个视图,然后从视图中选择。

由于您的示例中没有任何NULL,并且您没有提及它们,我假设您知道如何处理NULL。