Sql查询查找多行之间的日期

时间:2011-03-30 16:15:07

标签: sql oracle

我有一个包含三列的表(City_Code | Start_Date | End_Date)。
假设我有以下数据:

New_York|01/01/1985|01/01/1987
Paris|02/01/1987|01/01/1990 
San Francisco|02/01/1990|04/01/1990
Paris|05/01/1990|08/01/1990 
New_York|09/01/1990|11/01/1990 
New_York|12/01/1990|19/01/1990 
New_York|20/01/1990|28/01/1990 

我想知道有人住在他住所的最后一个城市的日期。在这个例子中,只使用sql是New_York(09/01 / 1990-28 / 01/1990)。我可以通过使用java操作数据来获得这段时间,但是可以使用普通的sql吗?

提前致谢

9 个答案:

答案 0 :(得分:1)

您可以使用以下方式获取城市居住的第一个和最后一个日期:

 SELECT TOP 1 City_Code, MIN(Start_Date), Max(End_Date)
 FROM Table
 GROUP BY City_Code
 ORDER BY Max(End_Date) desc

但问题是,开始日期将是相关城市居住的第一个日期。

答案 1 :(得分:1)

对于10g你没有SELECT TOP n的选项,所以你必须有点创意。

WITH last_period
AS
(SELECT city, moved_in, moved_out, NVL(moved_in-LEAD(moved_out, 1) OVER (ORDER BY city), 0) AS lead
FROM periods
WHERE city = (SELECT city FROM periods WHERE moved_out = (SELECT MAX(moved_out) FROM periods)))
SELECT city, MIN(moved_in) AS moved_in, MAX(moved_out) AS moved_out
FROM last_period
WHERE lead >= 0
GROUP BY city;

这适用于您提供的示例数据集。它可以对大型数据集进行一些优化,但是为您提供了一个在Oracle 10g上进行测试的工作示例。

答案 2 :(得分:0)

如果是MySQL,您可以轻松使用

TIME_TO_SEC(TIMEDIFF(end_date, start_date)) AS `diff_in_secs`

在几秒钟内有时间差,你可以继续。

答案 3 :(得分:0)

如果您使用的是SQL Server,则可以使用DateDiff()函数

DATEDIFF ( datepart , startdate , enddate )

http://msdn.microsoft.com/en-us/library/ms189794.aspx

修改

我不知道甲骨文,但确实找到了this article

答案 4 :(得分:0)

在SQL Server上,你不能使用:

SELECT TOP 1 City_Code, Start_Date + "-" + End_Date 
FROM MyTable
ORDER BY enddate DESC

这将获得具有最新结束日期的日期和城市。 假设您正在尝试找到最近居住的城市,并用短划线格式化。

答案 5 :(得分:0)

鉴于这是Oracle,您只需减去结束日期和开始日期即可获得介于两者之间的天数。

Select City_Code, (End_Date - Start_Date) Days
From MyTable
Where Start_Date =  (
                        Select Max( T1.Start_ Date )
                        From MyTable As T1
                        )

答案 6 :(得分:0)

SELECT 
  MAX(t.duration) 
FROM (
       SELECT 
          (End_Date - Start_Date) duration 
       From 
           Table
) as t

我希望这会奏效。

答案 7 :(得分:0)

如果您只想计算最后一个居住城市的最后一段时间长度,那么它可能是这样的:

SELECT TOP 1
  City_Code,
  End_Date - Start_Date AS Days
FROM atable
ORDER BY Start_Date DESC

但是,如果你的意思是包括这个人曾经居住在一个恰好是他们居住的最后一个城市的城市的所有时期,那么它会有点复杂,但不会太多:

SELECT TOP 1
  City_Code,
  SUM(End_Date - Start_Date) AS Days
FROM atable
GROUP BY City_Code
ORDER BY MAX(Start_Date) DESC

但上述解决方案最有可能仅在计算所有城市的数据后返回最后一个城市信息。我们需要吗?不一定,也许我们应该使用另一种方法。也许是这样的:

SELECT
  City_Code,
  SUM(End_Date - Start_Date) AS Days
FROM atable
WHERE City_Code = (SELECT TOP 1 City_Code FROM atable ORDER BY Start_Date DESC)
GROUP BY City_Code

答案 8 :(得分:0)

我的时间很短 - 但这感觉就像你可以使用窗口函数LAG来比较上一行,并在城市变化时保留该行的相应开始日期,并且当它没有改变时城市是一样的 - 这应该正确地保留范围。