Oracle SQL - 我可以为查询添加时间戳吗?

时间:2012-09-12 19:38:31

标签: sql oracle

我有一个简单的查询:

Select         Count(p.Group_ID)
From           Player_Source P 
  Inner Join   Feature_Group_Xref X On P.Group_Id=X.Group_Id 
where          x.feature_name ='Try this site'

在当前时刻吐出特定测试组中的当前人数。

如果我想看看这个号码是什么,比如说,在9/10/12而不是,我可以在查询中添加一些东西来分析这些信息,就像2天前数据库那样吗?

2 个答案:

答案 0 :(得分:3)

没有。如果要存储历史信息,则需要将其合并到模式中。例如,您可以扩展Feature_Group_Xref以添加列Effective_Start_TimestampEffective_End_Timestamp;要查找当前具有给定功能的组,您可以编写AND Effective_End_Timestamp > CURRENT_TIMESTAMP()(或AND Effective_End_Timestamp IS NULL,具体取决于您希望如何定义列),但要查找哪些组在特定时间具有给定功能,你会写AND ... BETWEEN Effective_Start_Timestamp AND Effective_End_Timestamp(或AND Effective_Start_Timestamp < ... AND (Effective_End_Timestamp > ... OR Effective_End_Timestamp IS NULL))。

维基百科有一篇关于人们用来解决此类问题的各种架构设计的好文章:见http://en.wikipedia.org/wiki/Slowly_changing_dimension

答案 1 :(得分:1)

这取决于......

至少在理论上你可以使用闪回查询

Select Count(p.Group_ID)
  From Player_Source as of timestamp( date '2012-09-10' ) P 
       Join Feature_Group_Xref as of timestamp( date '2012-09-10' ) X 
         On P.Group_Id=X.Group_Id 
 where x.feature_name ='Try this site'

但是,这需要您具有执行闪回查询所需的权限,并且有足够的UNDO供Oracle应用,以便能够返回到这些表在午夜两天的状态前。数据库不太可能被配置为保留那么多UNDO,尽管通常是可能的。如果您恰好使用Oracle Total Recall,此查询也会有效。

但更有可能的是,您需要修改架构定义,以便存储历史信息,然后可以在某个时间点查询这些信息。有多种方法可以实现这一点 - 在表中添加有效和到期日期列,因为@ruakh建议这是更受欢迎的选项之一。在您的特定情况下哪些选项适用取决于多种因素,包括您希望保留多少历史记录,数据更改频率等等。