1

我有一张表格,它定义了仅使用月和日的几个非重叠日期。它基本上是库存物品的“库存”表格,允许您在季节性业务中存储一年中的不同金额。以下是一个单个项目库存表的外观示例。请注意,我有一个项目表,我没有在这里显示。在此表中,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需要是2012年11月1日。在我的示例中,我展示了2013年,因为这是我能够用来生成此查询的唯一逻辑。

这里我怀疑我的问题可能是一个更大的设计缺陷,所以我在寻找如何做到这一点,否则一个更好的主意一个答案,也许有一些原因,这个设计是一个坏主意。

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

我正在使用SQL Server作为前端应用程序的数据库和MS Access。我可以使用T-SQL或Access VBA,因此您的解决方案可以位于任一个中。

回答

1

我相信这个肮脏-where子句,黑客应该这样做:

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"))) 

注重的是,这些两个逻辑表达式在今年(2013与2012)不同。如果开始 - 结束按照时间顺序,则使用第一个表达式(同一年)。如果不是,则使用第二个表达式(从去年开始,以当前结束)。

然而这可能会有非常差的表现。我建议你将日期存储为两个单独的列,并使用这个或类似的逻辑来查询。只有这样你才能利用索引。

+1

'我建议你把你的日期存储为两个单独的列'你能澄清一下吗?你是否建议他们是日期栏?我想知道是否可以更好地将我的股票日期存储为DayOfYearNumber。然后,我所要做的就是获取CurrentDayOfYearNumber,并找出它适合哪个范围。这样做肯定会更快,并且可以使用索引,不是吗? – HK1

+0

我的想法是介绍月和日,这样更容易维护系统。但是你的想法应该是更好的表现。然后,您可以应用类似的where子句。 – OzrenTkalcecKrznaric

相关问题