用于显示具有时间间隔的开始/结束点的SQL查询

时间:2013-03-16 11:19:54

标签: c# asp.net sql tsql sql-server-2005

我有一个名为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

我将vehicle_Info表格作为

vehicle_Name

DPT011
AA000AA
Z400

首先,我从vehicle_Info表中搜索所有车辆 当我在vehicle_Summary上查询b / w两个时间间隔时 说2012-02-08 04:44:44.444和2012-12-08 09:44:44.444

我希望是

vehicleName                     start_Point                   end_Point
AA000AA                         Denver                        Geneva
DPT011                          Tasmania                      Manila

我正在使用MS Sql server 2k5,我希望这是查询而不是在C#中执行手动逻辑。这可能吗

2 个答案:

答案 0 :(得分:0)

假设A_Date为Datetime,您可以使用Between运算符来获得如下结果: -

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

或尝试这样: -

WHERE startdate >= startdate AND enddate <=enddate

答案 1 :(得分:0)

你可以这样做:

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

这会给你:

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

更新1

您也可以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

相关问题