建立一个只有 1 个日期的日期范围

Posted

技术标签:

【中文标题】建立一个只有 1 个日期的日期范围【英文标题】:Building a Date Range with only 1 date 【发布时间】:2011-12-03 03:19:47 【问题描述】:

在 Oracle 中,我有一个如下表

ID、Acct、ParentID、StartTime、地址、城市、州、邮编

这包含任意给定数量的客户帐户的多行。每当创建客户时,应用程序都会输入一行。每当客户更改其地址时,都会创建一个新行。所以一个客户只能有 1 行或 N 行。

我想做的是创建更有用的报告表,其中包括

ID、Acct、ParentID、StartTime、EndTime、地址、城市、州、邮编

每当创建新地址时,任何超过一行的记录都有 EndTime。只有一条记录的客户将留下一个 NULL EndTime。

提前致谢

使用我开发的解决方案进行了更新 -- 感谢您的输入,这就是我想出的所有内容

select 
  ID           ,
  ACCOUNT_NO         ,
  PARENTID
  STARTTIME              ,
 MAX(mod_t)OVER( ORDER BY poid_id0 ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) as END_T,
  ADDRESS            ,
  CITY               ,
  FIRST_NAME         ,
  LAST_NAME          ,
  STATE              ,
  ZIP

【问题讨论】:

你怎么知道两行代表同一个客户账户?我假设 Acct 是一样的,但还有什么其他的吗? Stuart - 是的,Acct 是唯一的字母数字值 感谢 Raihan 的额外标签。新手,来了真的很喜欢这个社区,希望在未来做出贡献。 @DouglasKatz:不客气。另外,由于您是 *** 的新手,我想通知您,您可以通过选中答案旁边的勾号来接受对您最有帮助的答案。 【参考方案1】:
SELECT Adr.ID, Adr.Acct, X.FromDate, Adr.StartTime AS ToDate, Adr.Address, ...
FROM
    Adr INNER JOIN
    (SELECT MAX(ID) AS ActualAdrID, MIN(StartTime) As FromDate FROM Adr GROUP BY Acct) X
        ON Adr.ID = X.ActualAdrID;

我按帐户(我猜一个帐户是一个客户)将地址分组到 X 中。我还假设 ID 是每个新记录递增的主键。 X 将保存一个客户的最后一个 ID 和第一个 StartTime。然后将地址连接到 x,这意味着只返回每个客户的最后一个地址。因此,Adr.StartTime 是最后一个 StartTime。第一个 StartTime 取自子查询 X。


编辑:

SELECT
    A.ID,
    A.Acct,
    A.StartTime,
    (SELECT MIN(B.StartDate) FROM Adr B WHERE B.Acct=A.Acct AND B.ID>A.ID) AS EndDate,
    A.Address,
    ...
FROM Adr A;

【讨论】:

我还会将表中的日期命名为“Created”而不是“StartTime”。这样会更全面。 我希望我可以构建 DDL Olivier,但这是一个我正在尝试挖掘的旧应用程序。您的查询非常适合提供最新的地址,但不幸的是,我试图挖掘的是任何给定地址的每个 Acct 的范围。在我们现在使用的应用程序中,我们只需在添加新地址时将 endDate 记录在 Addr 行中。不过感谢您的回答。 在这种情况下,我认为 NULL EndDate 没有问题,它只是告诉您地址仍然有效,因此没有结束日期。如果您不喜欢这个 NULL 值,请将其替换为实际日期:NVL(myDate,CURRENT_DATE)。但是你的问题不是很清楚。事实上,你的帖子根本没有问题。你只列出一些事实,让我们猜猜问题是什么。 查看我的编辑。 WHERE 条件也可以是WHERE B.Acct=A.Acct AND B.StartDate>A.StartDate 关于缺少问题的公平点。妥当注明。新手,仍在学习社区,非常感谢您的努力。

以上是关于建立一个只有 1 个日期的日期范围的主要内容,如果未能解决你的问题,请参考以下文章

web api设计:日期范围查询(只有月份和年份)

在 MS Access 中插入具有日期范围的多条记录

从日期范围中删除几个日期

日期范围验证

GROUP BY 日期范围日期

SqlServer 查询星期数所在日期范围的日期值