简体   繁体   English

sql查询以时间间隔显示起点/终点

[英]sql query for displaying start/end points with time interval

I have a table called vehicle_Summary and the data loks like: 我有一个名为vehicle_Summary的表,数据类似:

A_Date                         vehicle_Name        Location_Name
2012-02-08 09:36:20.000        AA000AA               Denver
2012-03-08 09:36:20.000        AA000AA               Tokyo
2012-04-08 09:30:50.000        AA000AA               Melbourne
2012-12-08 09:36:20.000        AA000AA               Geneva
2012-22-08 00:00:00.000        AA000AA               NY 

2012-01-08 09:36:20.000        DPT011                Hobart
2012-03-08 09:36:20.000        DPT011                Tasmania
2012-04-08 09:30:50.000        DPT011                Java
2012-12-08 09:36:20.000        DPT011                Manila
2012-22-08 00:00:00.000        DPT011                Singapore

and i have vehicle_Info table as 我有vehicle_Info表作为

vehicle_Name

DPT011
AA000AA
Z400

So first i search all vehicles from vehicle_Info table and when i query b/w two time interval on vehicle_Summary say 2012-02-08 04:44:44.444 and 2012-12-08 09:44:44.444 所以首先我从Vehicle_Info表中搜索所有车辆,当我在Vehicle_Summary中查询两个时间间隔时,说2012-02-08 04:44:44.444和2012-12-08 09:44:44.444

wt i expect is 我期望的是

vehicleName                     start_Point                   end_Point
AA000AA                         Denver                        Geneva
DPT011                          Tasmania                      Manila

im using MS Sql server 2k5 , i want this as query instead of performing the manual logic in C#. 我使用MS Sql服务器2k5,我希望将此作为查询,而不是在C#中执行手动逻辑。 is this possible 这可能吗

Assuming A_Date as Datetime , you can use Between operator to get your result something like this:- 假设A_Date为Datetime ,则可以使用Between运算符来获得如下结果:

WHERE A_Date Between '1/20/2009' And '2/21/2009'

or try like this:- 或尝试这样:-

WHERE startdate >= startdate AND enddate <=enddate

You can do this: 你可以这样做:

WITH CTE
AS
(
  SELECT
    vehicle_name,
    MIN(A_Date) AS StartDate,
    MAX(A_Date) AS EndDate
  FROM vehicle_Summary
  WHERE A_Date BETWEEN '2012-08-02 04:44:44.444'
                   AND '2012-08-12 09:44:44.444'
  GROUP BY vehicle_name
)
SELECT 
  c.vehicle_name, 
  s.Location_name AS start_Point, 
  e.Location_name AS end_Point
FROM CTE AS c
INNER JOIN vehicle_summary s  ON s.vehicle_name = c.vehicle_name
                             AND s.A_Date       = c.StartDate 
INNER JOIN vehicle_summary e  ON e.vehicle_name = c.vehicle_name
                             AND e.A_Date       = c.EndDate; 

SQL Fiddle Demo SQL小提琴演示

This will give you: 这将为您提供:

| VEHICLE_NAME | START_POINT | END_POINT |
------------------------------------------
|      AA000AA |      Denver |    Geneva |
|       DPT011 |    Tasmania |    Manila |

Update 1 更新1

You can also, JOIN the other table to get the vehicle name from there: 您还可以JOIN另一个表以从那里获取车辆名称:

WITH CTE
AS
(
  SELECT
    i.vehicle_id,
    i.vehicle_name,
    MIN(s.A_Date) AS StartDate,
    MAX(s.A_Date) AS EndDate
  FROM vehicle_Summary AS s
  INNER JOIN vehicle_Info AS i ON s.vehicle_id = i.vehicle_id
  WHERE s.A_Date BETWEEN '2012-08-02 04:44:44.444'
                   AND '2012-08-12 09:44:44.444'
  GROUP BY i.vehicle_id,
           i.vehicle_name
)
SELECT 
  c.vehicle_name, 
  s.Location_name AS start_Point, 
  e.Location_name AS end_Point
FROM CTE AS c
INNER JOIN vehicle_summary s  ON s.vehicle_id = c.vehicle_id
                             AND s.A_Date     = c.StartDate
INNER JOIN vehicle_summary e  ON e.A_Date     = c.EndDate
                             AND e.vehicle_id = c.vehicle_id;

Updated SQL Fiddle Demo 更新了SQL Fiddle演示

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

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