2015-03-25 110 views
0

我有一个MS sql查询,其中我计算了我的车的总公里数。为了实现这一点,我创建了一个查询,获取最后的数据并从第一个数据中减去它。我可以每天实现这一目标,但现在我需要的是每天都有,但在日期范围之内。这是我的代码1日期过滤器。从ms sql中的第一个数据中减去最后一个数据,但是每天都这样做

SELECT TOP 1 
(
    (
     (SELECT TOP 1 cast(kmrun as decimal(7,2)) as totkm 
      from [MARK_PASSIVE].[dbo].tblkmrun2 
       where PHILTIME BETWEEN '2015-03-02 00:00:00' AND '2015-03-02 23:59:00' 
        AND PLATENO = 'UUM572' ORDER BY PHILTIME DESC) 
        - 
     (SELECT TOP 1 cast(kmrun as decimal(7,2)) as totkm 
      from [MARK_PASSIVE].[dbo].tblkmrun2 
       where PHILTIME BETWEEN '2015-03-02 00:00:00' AND '2015-03-02 23:59:00' 
        AND PLATENO = 'UUM572' ORDER BY PHILTIME ASC) 
    ) 
) as finkm , 
(CONVERT(char(10), PHILTIME, 126)) as NEWDATE 
from [MARK_PASSIVE].[dbo].tblkmrun2 
where PHILTIME BETWEEN '2015-03-02 00:00:00' AND '2015-03-02 23:59:00' 

现在这里是我的代码日期范围和结果以及。结果显示相同的,但由于即时得到总公里运行的每一天不是针对整个日期范围

SELECT DISTINCT (CONVERT(char(10), PHILTIME, 126)), 
( 
    (
     (
      SELECT TOP 1 cast(kmrun as decimal(7,2)) as totkm 
       from [MARK_PASSIVE].[dbo].tblkmrun2 
        where PHILTIME BETWEEN '2015-03-01 00:00:00' AND '2015-03-06 23:59:00' 
         AND PLATENO = 'UUM572' group by kmrun ORDER BY PHILTIME DESC 
     ) - 
     (
      SELECT TOP 1 cast(kmrun as decimal(7,2)) as totkm 
       from [MARK_PASSIVE].[dbo].tblkmrun2 
        where PHILTIME BETWEEN '2015-03-01 00:00:00' AND '2015-03-06 23:59:00' 
         AND PLATENO = 'UUM572' ORDER BY PHILTIME ASC 
     ) 
    ) 
) as finkm , 
(CONVERT(char(10), PHILTIME, 126)) as NEWDATE 
    from [MARK_PASSIVE].[dbo].tblkmrun2 
     where PHILTIME BETWEEN '2015-03-01 00:00:00' AND '2015-03-06 23:59:00' 
      ORDER BY NEWDATE DESC 

这里的结果日期范围

enter image description here

一定是不一样的这里是预期的结果

enter image description here

与我的查询日期范围内的问题是计算整个日期范围,从1开始获取第一个数据,从6开始获取最后一个数据。

请帮助我为日期范围重新配置我的sql查询。

由于

数据为March1

enter image description here

数据为MAR2

enter image description here

数据为Mar3

enter image description here

数据为3月4日

enter image description here

数据为3月5日

enter image description here

数据为3月6日

enter image description here

结果可能会发生变化SI我只限于5个数据。

+0

你能提供我们可以使用一些样本数据? – 2015-03-25 06:23:36

+0

更新了我的帖子先生。 – Dodgeball 2015-03-25 06:32:37

回答

1

试试这个:

DECLARE @startDate DATE = '20150301' 
DECLARE @endDate DATE = '20150306' 

;WITH Cte AS(
    SELECT *, 
     FirstPhilTime = ROW_NUMBER() OVER(PARTITION BY CAST(PhilTime AS DATE) ORDER BY PhilTime ASC), 
     LastPhilTime = ROW_NUMBER() OVER(PARTITION BY CAST(PhilTime AS DATE) ORDER BY PhilTime DESC) 
    FROM tblkmrun2 
) 
SELECT 
    CAST(PhilTime AS DATE), 
    FinKm = MAX(CASE WHEN LastPhilTime = 1 THEN KmRun END) - MAX(CASE WHEN FirstPhilTime = 1 THEN KmRun END) 
FROM cte 
WHERE 
    PhilTime >= @STARTDATE 
    AND PhilTime < DATEADD(DAY, 1, @ENDDATE) 
GROUP BY CAST(PhilTime AS DATE) 
+0

它在某些日期返回否定答案。 – Dodgeball 2015-03-26 03:08:07

+1

@Dodgeball,是的,如果最后一个'PHILTIME'的'kmrun'小于第一个'PHILTIME'的'kmrun',它会。 – 2015-03-26 03:23:38

+0

调整了一下。感谢所有的帮助,并为这个麻烦道歉。 – Dodgeball 2015-03-26 03:51:19

相关问题