【发布时间】:2011-07-08 16:27:18
【问题描述】:
这个问题的背景是存储小部件的仓库的计费系统。存储费基于小部件的大小(例如 $x * 高度 * 长度 * 宽度)。这部分很容易。我使用以下 SQL 来计算应付金额并按用户 ID 汇总。
Select UserID, Sum((Height * Length * Width * 5) as AmtDue From Widget
Where StatusID=2
Group By UserID
5 目前是一个任意值。最终我会将它作为参数传递或从数据库中的表中获取。假设现在总是 5。
这是我正在努力解决的部分。费用在月底计算,并根据该月小部件存储在仓库中的天数按比例分配(例如,如果小部件在 30 天的月份中有 15 天在仓库中存放,则应支付的费用为金额的 50%)。在我的 Widget 表中,我有一列 DateReceived 和 DateShipped。 DateReceived 始终具有日期时间值。 DateShipped 有时为空(例如,如果小部件仍在存储中)。我有可用于 CycleStart 和 CycleEnd 的参数,它们代表相关计费月份的开始和结束。我正在尝试修改我的 SQL 查询以在选择表达式中包含一个比例因子,该因子等于(存储天数/月天数)。换句话说,AmtDue 变为 (height * length * width * 5 * prorate factor) 我该怎么做?
这里有一个例子来帮助说明如何计算比例因子。
如果@CycleStart = 7/1/11 和 @CycleEnd = 7/31/11 mm/dd/yy
DateReceived | DateShipped | Prorate Factor
6/5/11 Null 100%
6/5/11 7/15/11 48.38%
7/30/11 8/5/11 6.45%
7/15/11 7/25/11 35.48%
我真的在为这种条件的性质以及我们正在处理日期时间值的事实而苦苦挣扎。
【问题讨论】:
-
我们可以假设每个月都是 30 天吗?
-
我们可以大大简化事情。否则我宁愿准确并使用相关月份的实际天数。
标签: sql sql-server sql-server-2008