每月SQL Server 2008信息分为几天

时间:2011-07-07 14:30:24

标签: sql-server-2008

我有一个包含“句点”的表,看起来像这样(添加了一些行作为示例):

          | StartDate | EndDate  | Amount1 |   Amount2 | Type
==============================================================
1         |  20110101 | 20110131 |      89 |      2259 |    1
2         |  20110201 | 20110228 |     103 |     50202 |    1
3         |  20110301 | 20110331 |      90 |     98044 |    1
4         |  20110401 | 20110430 |      78 |    352392 |    1
==============================================================


正如你所看到的,每个“时期”恰好是一个月。每个月代表四次(有4种类型),所以这个表有48行
我有一个选项,它给出了每个时期的天数(简单地说,是EndDate的一天,因为它总是那个时期的天数)和Amount1PerDay和Amount2PerDay(那个时期的数量除以天数) )。

第一个问题是:
我需要在此表格上显示View,其中显示每个时段中每天的一行,其中Amount1和Amount2列保存该时段的值除以该时段内的天数。

第二个问题是:
大多数这些部门都没有给我一个整数。小数不是一个选项,所以我需要将剩余天数(除法后)除以该期间的前几天。 以1月份为例:Amount1有89个。超过31天,几乎是2,9。因此每天2次,前27天获得3次(,9 * 31 = 27次)。这样结果只有整数。

2 个答案:

答案 0 :(得分:1)

Q1

本文介绍了如何选择日期范围: http://social.msdn.microsoft.com/forums/en-US/sqlexpress/thread/916161f2-cf3c-4b6b-9015-9d13ed1af49e/

这应该产生一个名为THEDATE的列用于Q2

Q2

如何选择分配金额如下: SELECT FLOOR(AMOUNT / NUMDAYS)+ IIF(DAY(THEDATE)< =(AMOUNT - NUMDAYS * FLOOR(AMOUNT / NUMDAYS)),1,0)

NUMDAYS = DATEDIFF(d,STARTDATE,ENDDATE)+ 1

答案 1 :(得分:1)

假设StartDateEndDate属于datedatetimeAmount1& Amount2是整数:

SELECT
  Date,
  Amount1 = Amount1Whole + CASE WHEN DayNum < Amount1Rem THEN 1 ELSE 0 END,
  Amount2 = Amount2Whole + CASE WHEN DayNum < Amount2Rem THEN 1 ELSE 0 END,
  Type
FROM (
  SELECT
    Date         = DATEADD(day, v.number, t.StartDate),
    DayNum       = v.number,
    Amount1Whole = Amount1 / DAY(t.EndDate),
    Amount2Whole = Amount2 / DAY(t.EndDate),
    Amount1Rem   = Amount1 % DAY(t.EndDate),
    Amount2Rem   = Amount2 % DAY(t.EndDate),
    t.Type
  FROM atable t
    INNER JOIN master..spt_values v ON v.type = 'P'
      AND v.number BETWEEN 0 AND DATEDIFF(day, t.StartDate, t.EndDate)
) s

当两个操作数都是整数时,SQL Server执行整数除法,因此,例如,5 / 2的结果将是2,而不是2.5

master..spt_values是一个长期存在的系统表,用于内部目的。它包含可用作number (tally) table的行子集,这是在此查询中使用的行。