【问题标题】:Check If Date Falls In Period With Year Unspecified检查日期是否在未指定年份的期间
【发布时间】:2013-08-01 13:39:55
【问题描述】:

我有一个表格,它只使用月份和日期定义了几个不重叠的日期时段。它基本上是一个库存项目的“库存”表,允许您为季节性业务在一年中库存不同数量的库存。下面是单个项目的库存表可能看起来如何的示例。请注意,我有一个未在此处显示的 Items 表。在下表中,ItemID 是外键,StockID 是主键。

StockID    ItemID    BeginDate    EndDate    QtyTrigger    ReorderQty
      1         1         11/1       1/31             0             1
      2         1          2/1       5/31             1             2
      3         1          6/1      10/31             1             1

假设我想要获取日期为 2013 年 1 月 15 日的重新排序查询/报告。按照我当前的逻辑,我的查询将返回错误,因为它看起来像这样:

SELECT i.*, st.QtyTrigger, st.ReorderQty
FROM t20Itm AS i INNER JOIN t20Itm_Stock AS st ON i.ItemID = st.ItemID
WHERE #01/14/2013# >= CDate(st.BeginDate & "/2013" ) AND
#01/14/2013# <= CDate(st.EndDate & "/2013")
AND i.QtyOnHand <= st.QtyTrigger

问题是这个例子中 11/1 的 BeginDate 需要是 11/1/2012。在我的示例中,我显示的是 2013 年,因为这是我能够想出的用于生成此查询的唯一逻辑。

我怀疑我的问题可能是一个更大的设计缺陷,所以我正在寻找如何完成这个或更好的想法的答案,也许有一些原因导致这个设计是一个坏主意。

我知道我可以通过不允许超过 12 月 31 日的日期跨度来实现这一点。但是,该应用程序的许多用户都有一个从 11 月到 2 月的时间段,这是他们最慢的月份。他们最终会创建两个不同的日期跨度,其中包含相同的数据,一个用于 11 月/12 月,另一个用于 1 月/2 月。

我将 SQL Server 用于数据库,将 MS Access 用于前端应用程序。我可以使用 T-SQL 或 Access VBA,所以你的解决方案可以是任何一个。

【问题讨论】:

    标签: sql sql-server ms-access inventory-management


    【解决方案1】:

    我相信这个 filthy-where-clause-hack 应该这样做:

    WHERE 
      ((CDate(st.BeginDate & "/2013" ) <= (CDate(st.EndDate & "/2013" )) 
        AND (#01/14/2013# BETWEEN CDate(st.BeginDate & "/2013" ) AND CDate(st.EndDate & "/2013")))
      OR
      ((CDate(st.BeginDate & "/2013" ) > (CDate(st.EndDate & "/2013" )) 
        AND (#01/14/2013# BETWEEN CDate(st.BeginDate & "/2012" ) AND CDate(st.EndDate & "/2013")))
    

    请注意,这两个 OR 表达式在年份(2013 年与 2012 年)中是不同的。如果 begin-end 按时间顺序排列,则使用第一个表达式(同一年)。如果不是,则使用第二个表达式(从去年开始,以当前结束)。

    但是,这可能会导致性能非常差。我建议您将日期存储为两个单独的列,并使用此或类似的逻辑进行查询。只有这样您才能利用索引。

    【讨论】:

    • I suggest you store your dates as two separate columns 你能澄清一下吗?您是否建议它们改为日期列?我想知道将我的库存日期存储为 DayOfYearNumber 是否会更好。然后我所要做的就是获取 CurrentDayOfYearNumber 并找出它适合哪个跨度。如果避免强制转换并且可以使用索引,那肯定会更快,不是吗?
    • 我的想法是引入月份和日期,这样维护系统更容易。但是您的想法在性能方面应该更好。然后,您可以应用类似的 where 子句。
    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多