简体   繁体   English

SQL DATEDIFF返回

[英]SQL DATEDIFF Returns

I don't want to show my whole query as it is very specific but I will try to explain briefly. 我不想显示我的整个查询,因为它非常具体,但是我将尝试简要地解释一下。

The following query works perfectly and I got 6000 records as a result. 下面的查询工作完美,我得到了6000条记录。

  SELECT
      DISTINCT ID,
      NAME,
      CASE WHEN A.ID IS NULL THEN 'NOT EX.'
       ELSE A.Whatever
      END AS A_Whatever,
      D.Z1 AS A.P 
      --AND SO ON......          

  FROM A 

      INNER JOIN A ON A.ID= B.ID AND A.Nb= B.Nb
      LEFT JOIN T AS T2_ID ON T2_D.Z= A.Z
      LEFT JOIN L1 ON A.NR = L1.NR AND A.S = L1.S
      LEFT JOIN LF ON LF.NR = L1.LNR
      --AND SO ON.......

However, when i add a DATEDIFF calculation I get only 100 Rows in the answer: 但是,当我添加DATEDIFF计算时,答案中只有100行:

  SELECT DISTINCT 
      ID,
      NAME,
      CASE WHEN A.ID IS NULL THEN 'NOT EX.'
        ELSE A.Whatever
      END AS A_Whatever,
      D.Z1 AS A.P,
      DATEDIFF(dd,A.ADATE,A.BDATE)

FROM A 
  INNER JOIN A ON A.ID= B.ID AND A.Nb= B.Nb
  LEFT JOIN T AS T2_ID ON T2_D.Z= A.Z
  LEFT JOIN L1 ON A.NR = L1.NR AND A.S = L1.S
  LEFT JOIN LF ON LF.NR = L1.LNR
  --AND SO ON.......

I am expecting 6000 rows with a correct query using DATEDIFF in line with what the following query returns: 我期望使用以下日期返回的内容使用DATEDIFF进行正确查询的6000行:

  SELECT 
      DISTINCT *,
      DATEDIFF(dd,A.ADATE,A.BDATE)
  FROM A 
      INNER JOIN A ON A.ID= B.ID AND A.Nb= B.Nb
      LEFT JOIN T AS T2_ID ON T2_D.Z= A.Z
      LEFT JOIN L1 ON A.NR = L1.NR AND A.S = L1.S
      LEFT JOIN LF ON LF.NR = L1.LNR
      --AND SO ON....... 

But I do not need all of them I need just the selected ones and the DATEDIFF but combining the queries above did not work for some reason that i do not know. 但是我不需要所有这些,我只需要选择的那些和DATEDIFF,但是由于某些我不知道的原因,将上面的查询组合不起作用。 Can anyone see why i am not getting the expected row count in my second query? 谁能看到我为什么在第二个查询中没有得到预期的行数?

You can just wrap your query in a CTE and perform the DATEDIFF on the result set returned by the CTE : 您可以将查询包装在CTE然后对CTE返回的结果集执行DATEDIFF

WITH DISTINCT_CTE AS (
   SELECT
         DISTINCT ID,
         NAME,
         CASE WHEN A.ID IS NULL THEN 'NOT EX.'
              ELSE A.Whatever
         END AS A_Whatever,
         D.Z1 AS A.P 
         --AND SO ON......              
   FROM A 

        INNER JOIN A ON A.ID= B.ID AND A.Nb= B.Nb
        LEFT JOIN T AS T2_ID ON T2_D.Z= A.Z
        LEFT JOIN L1 ON A.NR = L1.NR AND A.S = L1.S
        LEFT JOIN LF ON LF.NR = L1.LNR
           --AND SO ON.......
)
SELECT *, DATEDIFF(dd, ADATE, BDATE)
FROM DISTINCT_CTE

You could try a subquery... first subquery the entire thing. 您可以尝试子查询...首先对整个对象进行子查询。

In the receiving query do another subquery for the DATEDIFF. 在接收查询中,对DATEDIFF进行另一个子查询。 For this subquery you need the primary key to get back to the correct row for the dates, which if I'm interpreting correctly is A.ID . 对于此子查询,您需要主键返回到日期的正确行,如果我正确解释的话,它是A.ID

SELECT dT.ID, dT.Name, dT.A_Whatever           
      ,(SELECT DATEDIFF(dd, A2.ADATE, A2.BDATE)
          FROM A AS A2
         WHERE dT.ID = A2.ID --the primary key
       ) AS [DateDiff]
        --AND SO ON........
  FROM ( 
         SELECT DISTINCT ID,
                NAME,
                CASE WHEN A.ID IS NULL THEN 'NOT EX.'
                                       ELSE A.Whatever
                END AS A_Whatever,
                D.Z1 AS A.P 
               --AND SO ON......          

         FROM A 

             INNER JOIN A ON A.ID= B.ID AND A.Nb= B.Nb
             LEFT JOIN T AS T2_ID ON T2_D.Z= A.Z
             LEFT JOIN L1 ON A.NR = L1.NR AND A.S = L1.S
             LEFT JOIN LF ON LF.NR = L1.LNR
             --AND SO ON.......
      ) AS dT

You can try the following query : 您可以尝试以下查询:

SELECT T1.*, T2.DateDiff
FROM ( 
    SELECT DISTINCT ID,
            NAME,
            CASE WHEN A.ID IS NULL THEN 'NOT EX.'
                                   ELSE A.Whatever
            END AS A_Whatever,
            D.Z1 AS A.P 
           --AND SO ON......          
    FROM A 
         INNER JOIN B ON A.ID= B.ID AND A.Nb= B.Nb
         LEFT JOIN T AS T2_ID ON T2_D.Z= A.Z
         LEFT JOIN L1 ON A.NR = L1.NR AND A.S = L1.S
         LEFT JOIN LF ON LF.NR = L1.LNR
         --AND SO ON.......
  ) AS T1

JOIN (SELECT ID, DATEDIFF(dd, ADATE, BDATE) as DateDiff from A as A2) AS T2
ON T1.ID= T2.ID

As the following attempts to display, if you are using select distinct AND removing date columns from view when introducing datediff() into the select clause that could be the cause of the change in rows returned. 如以下尝试显示的那样,如果在将datediff()引入select clause时使用select distinct AND从视图中删除日期列,这可能是导致返回的行发生更改的原因。 Note in query 1 that as long as adate or bdate are displayed 5 rows would be returned, but without them (query 2) you just get one row. 请注意,在查询1中,只要显示adatebdate ,就会返回5行,但是没有它们(查询2),您只会得到一行。 Alternatively, if you removed distinct,from query 2 you would get all 5 rows but just the one column (this isn't shown below). 或者,如果您从查询2中删除了distinct,则将获得全部5行,但仅获得一列(下面未显示)。

try it out at SQL Fiddle SQL Fiddle上试用

MS SQL Server 2014 Schema Setup : MS SQL Server 2014架构设置

CREATE TABLE Sample
    ([ADATE] datetime, [BDATE] datetime)
;

INSERT INTO Sample
    ([ADATE], [BDATE])
VALUES
    ('2017-10-01 00:00:00', '2017-10-06 00:00:00'),
    ('2017-10-02 00:00:00', '2017-10-07 00:00:00'),
    ('2017-10-03 00:00:00', '2017-10-08 00:00:00'),
    ('2017-10-04 00:00:00', '2017-10-09 00:00:00'),
    ('2017-10-05 00:00:00', '2017-10-10 00:00:00')
;

Query 1 : 查询1

select distinct 'q1' qry, adate, bdate, datediff(day,adate,bdate) days_diff
from sample
order by adate

Results : 结果

| qry |                adate |                bdate | days_diff |
|-----|----------------------|----------------------|-----------|
|  q1 | 2017-10-01T00:00:00Z | 2017-10-06T00:00:00Z |         5 |
|  q1 | 2017-10-02T00:00:00Z | 2017-10-07T00:00:00Z |         5 |
|  q1 | 2017-10-03T00:00:00Z | 2017-10-08T00:00:00Z |         5 |
|  q1 | 2017-10-04T00:00:00Z | 2017-10-09T00:00:00Z |         5 |
|  q1 | 2017-10-05T00:00:00Z | 2017-10-10T00:00:00Z |         5 |

Query 2 : 查询2

select distinct 'q2' qry, datediff(day,adate,bdate) days_diff
from sample

Results : 结果

| qry | days_diff |
|-----|-----------|
|  q2 |         5 |

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM