【问题标题】:Calculating run down dates using only percentages using Microsoft SQL Server使用 Microsoft SQL Server 仅使用百分比计算运行日期
【发布时间】:2012-07-24 13:29:48
【问题描述】:

我有一张关于资源信息的表格,基本内容是:

ID    Total    Start        End          Used
----------------------------------------------
1     350      01-01-2012   31-12-2012   80.6%
2     250      01-01-2012   31-12-2012   51.5%
3     3500     01-01-2012   31-07-2013   12.5%
4     350      01-01-2012   31-10-2012   91.0%

列是:

  • Total -- 资源总数(货币、时间、纸张等)。
  • Start -- 资源开始日期
  • End -- 资源结束日期
  • Used -- 迄今为止使用的资源百分比

我必须尝试计算(或估计)资源何时会以目前使用的速度耗尽。

我尝试了几种不同的方法来使用使用的百分比和百分比,但没有任何意义,我很确定有一个简单的方法可以做到这一点,但我找不到它。

我的理想输出是下面的文本,但我可能会在应用程序中格式化:

You have used X% of your [resource name] in Y% of the time allotted, 
at this rate the resource will run down around [Run Down Date].

谁能算出这个是怎么计算的?

SQL Fiddle to play with

编辑:

为了使问题更清楚,我将解释如何计算单个日期:

对于第一行 (ID = 1)。

Average % per day = Percentage (80.6) / Days between Start and Today (205)
Average % per day = 0.003931707%

% remaining = Percentage (80.6%)
% remaining = 19.4%

Days remaining = Average % per day (0.003931707%) / % remaining (19.4%)
Days remaining = 49.34243176

Project Run Down = Today + Days Remaining (49.34243176)
Project Run Down = 11/09/2012 (11th Sep)

我已尝试将此过程转换为 SQL,但无法正常工作。

【问题讨论】:

  • 当更容易收集数据并在客户端执行计算时,为什么还要在 DB 中计算?
  • abatishchev - 仅仅因为它更容易并不能使它正确。
  • 我将使用调度包发送绑定到视图/sp 的电子邮件提醒,因此这需要在数据库端完成,调度包只有非常简单的工具。
  • 标题最初包含“MS-SQL”,因为许多人没有将标签“sql-server”与 MS 产品相关联。然后 marc_s 将其更改为不太有用。

标签: sql sql-server sql-server-2008 tsql datetime


【解决方案1】:

你可以试试这样的

declare @res table(
    id int identity(1,1)
    ,total int
    ,start date
    ,[end] date
    ,used float )


insert into @res(total, start , [end], used) 
values
    (350, '20120101', '20121231', 0.806)
    ,(250, '20120101', '20121231', 0.515)   


select 
*
,used/DATEDIFF(DAY,start,GETDATE()) as avUsePerDay
,1/(used/DATEDIFF(DAY,start,GETDATE())) as expectedDaysTotal
,DATEADD(day,1/(used/DATEDIFF(DAY,start,GETDATE())),start) as expectedToDie
from @res

【讨论】:

  • 这看起来很有希望,检查了两个示例并且工作正常。
【解决方案2】:

那就是……

SELECT DATEDIFF(d, [StartDate], GETDATE()) * 100.0 /  DATEDIFF(d, [StartDate], [EndDate]) AS PercentageTimeGone,
       DATEADD(d, (100 - USED) / (Used / DATEDIFF(d, [StartDate], GETDATE())), GETDATE()) AS ProjectedEndingDate
FROM Resources 

【讨论】:

  • 这会返回一个不正确的值,请参阅我的编辑以获得进一步的解释。
【解决方案3】:

关于什么

select id, total, start, end, datediff(day,start,getdate()) / ( total / 100 )

我不擅长计算,但在数字上它很管用。

一切顺利

【讨论】:

  • 我需要返回资源耗尽的日期而不是数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 2021-03-28
  • 2015-10-03
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
相关资源
最近更新 更多