DATE查询表(1990/01/01:2041/12/31)

时间:2010-04-11 05:19:56

标签: sql-server oracle ms-access db2 informix

我使用DATE的主表来查找日期和其他值,以便控制我的应用程序中的多个事件,间隔和计算。从01/01/1990到12/31/2041,它每天都有行。

我如何使用此查找表的一个示例是:

  1. 客户在:JAN-31-2010
  2. 上典当了一件物品
  3. 客户于2010年5月3日返回以赚取利息,以避免丧失该项目。
  4. 如果他支付1个月的利息,员工输入“1”并且应用程序查找典当
    日期(JAN-31-2010)在日期主表中,并将FEB-28-2010置于适用的利息中 pymt日期。由于FEB-31不存在,因此返回FEB-28!如果2010年是闰年,那就是 会回复FEB-29。
  5. 如果客户支付2个月,则退回MAR-31-2010。 3个月,APR-30 ......如果客户 支付超过3个月或日期查询表未涵盖的其他期间, 员工手动输入适用的日期。
  6. 这是日期查找表的样子:


    { Copyright 1990:2010, Frank Computer, Inc. }
    
    { DBDATE=YMD4- (correctly sorted for faster lookup) }
    
    CREATE TABLE     datemast 
    (
     dm_lookup       DATE,    {lookup col used for obtaining values below}
     dm_workday      CHAR(2), {NULL=Normal Working Date,}
                              {NW=National Holiday(Working Date),}
                              {NN=National Holiday(Non-Working Date),}
                              {NH=National Holiday(Half-Day Working Date),}
                              {CN=Company Proclamated(Non-Working Date),}
                              {CH=Company Proclamated(Half-Day Working Date)}
    
     {several other columns omitted}
    
     dm_description CHAR(30), {NULL, holiday description or any comments}
     dm_day_num     SMALLINT, {number of elapsed days since begining of year}
     dm_days_left   SMALLINT, (number of remaining days until end of year}
    
     dm_plus1_mth   DATE,     {plus 1 month from lookup date}
     dm_plus2_mth   DATE,     {plus 2 months from lookup date}
     dm_plus3_mth   DATE,     {plus 3 months from lookup date}
     dm_fy_begins   DATE,     {fiscal year begins on for lookup date}
     dm_fy_ends     DATE,     {fiscal year ends on for lookup date}
     dm_qtr_begins  DATE,     {quarter begins on for lookup date}
     dm_qtr_ends    DATE,     {quarter ends on for lookup date}
     dm_mth_begins  DATE,     {month begins on for lookup date}
     dm_mth_ends    DATE,     {month ends on for lookup date}
     dm_wk_begins   DATE,     {week begins on for lookup date}
     dm_wk_ends     DATE,     {week ends on for lookup date}
    
     {several other columns omitted}
    )
    IN "S:\PAWNSHOP.DBS\DATEMAST"; 
    

    有更好的方法吗?或者这是一种很酷的方法吗?

4 个答案:

答案 0 :(得分:2)

这是一种合理的做事方式。如果你研究data warehousing,你会发现那些系统经常使用类似的时间事实表系统。由于您使用的五十年间行中的行数少于20K,因此数据量不大。

假设存储提供比执行计算更好的性能;因为计算并不那么难(尽管它们都不是微不足道的),并且任何磁盘访问在计算方面都非常慢,所以大多数情况下并不是很明确。但是,将信息放在一个表中的便利性可能足以保证必须跟踪存储在表中的每个计算值的适当方法。

答案 1 :(得分:1)

这取决于您使用的数据库。 SQL Server对时态数据的支持非常糟糕,我几乎总是在那里使用日期事实表。但是像Oracle,Postgres和DB2这样的数据库有很好的支持,而且为OLTP应用程序动态计算日期通常更有效。

例如,Oracle有一个last_day()函数来获取一个月的最后一天,add_months()函数可以添加几个月。通常在Oracle中,我将使用一个流水线函数来获取开始日期和结束日期,并返回一个嵌套的日期表。

答案 2 :(得分:1)

在Oracle中生成日期行集的很酷方法是使用分层查询功能connect by。我已发布了此用法in another thread的示例。

在没有流水线功能的PL / SQL开销的情况下,它提供了很大的灵活性。

答案 3 :(得分:0)

好的,所以我用31天/月来测试我的应用来计算利率&当铺很满意!当地法律祈祷如下:从典当或最后一个int。 pymt。日期为5天,5%的本金利息,6至10天= 10%,11至15天= 15%,16天至1“月”= 20%。

所以兴趣表现在定义如下:

NUMBER OF ELAPSED DAYS SINCE
PAWN DATE OR LAST INTEREST PYMT

 FROM     TO  ACUMULATED
  DAY    DAY    INTEREST
-----   ----  ----------
    0      5       5.00%
    6     10      10.00%
   11     15      15.00%
   16     31      20.00%
   32     36      25.00%
   37     41      30.00%
   42     46      35.00%
   47     62      40.00%

   [... until day 90 (forfeiture allowed)]
   from day 91 to 999, daily prorate based on 20%/month.

英国在MAR-13或SEP-1752上发生了什么不好的事情?