1

使用 SQL Server 2000

我想按月保存详细信息

用户输入

ID = 001
Fromdate = 01/01/2012
Todate = 29/03/2012

ID = 002
Fromdate = 01/05/2012
Todate = 19/06/2012

ID = 003
Fromdate = 01/04/2012
Todate = 30/04/2012
.....

从用户条目中,我想将详细信息插入到 table1 中,条件是 fromdate 和 todate 拆分为按月(mm/yyyy)

预期产出

ID period fromdate todate

001 01/2012 01/01/2012 31/01/2012
001 02/2012 01/02/2012 29/02/2012
001 03/2012 01/03/2012 29/03/2012
002 05/2012 01/05/2012 31/05/2012
002 05/2012 01/06/2012 19/06/2012
003 04/2012 01/04/2012 30/04/2012
....
....

fromdate, todate fomat is dd/mm/yyyy period 格式是mm/yyyy

如何在 sql server 中执行此操作。

需要sql查询帮助

4

2 回答 2

1

首先,创建并填充具有以下列(至少)的日历表:

CREATE TABLE dbo.Calendar (
    BaseDate datetime NOT NULL PRIMARY KEY,
    Period char(7) NOT NULL,
    YearNumber int NOT NULL,
    MonthNumber int NOT NULL,
    IsFirstDayOfMonth bit NOT NULL,
    IsLastDayOfMonth bit NOT NULL
)

然后,此查询将返回您需要的数据,对于一对,fromdatetodate您当然可以将其放入存储过程中,并根据用户输入或您从应用程序执行 SQL 的任何方式调用它一次:

declare @ID char(3), @FromDate datetime, @ToDate datetime

select @ID ='001', @FromDate = '20120107', @ToDate = '20120917'

select
    @ID as 'ID',
    c.Period,
    case when c.IsFirstDayOfMonth = 0x0 then @FromDate else c.BaseDate end as 'FromDate',
    case when @ToDate < c1.BaseDate then @ToDate else c1.BaseDate end as 'ToDate'
from
    dbo.Calendar c
    join dbo.Calendar c1
    on c.YearNumber = c1.YearNumber and c.MonthNumber = c1.MonthNumber
where
    c.BaseDate between @FromDate and @ToDate and
    (c.IsFirstDayOfMonth = 0x1 or c.BaseDate = @FromDate) and
    c1.IsLastDayOfMonth = 0x1
于 2012-05-29T14:02:36.833 回答
1

你可以使用一个数字表(你有一个吗?)来生成月份:

SELECT
  ID,
  Period   = RIGHT(CONVERT(varchar(10), MonthStart, 103), 7),
  /*
  alternatively:
  Period = RIGHT('0' + RTRIM(MONTH(MonthStart), 2) + '/' + RTRIM(YEAR(MonthStart)),
  */
  FromDate = CASE WHEN RangeStart > MonthStart THEN RangeStart ELSE MonthStart END,
  ToDate   = CASE WHEN RangeEnd   < MonthEnd   THEN RangeEnd   ELSE MonthEnd   END
FROM (
  SELECT
    ID,
    RangeStart,
    RangeEnd,
    Monthstart,
    MonthEnd = DATEADD(DAY, -1, DATEADD(MONTH, 1, Monthstart))
  FROM (
    SELECT
      ID         = @ID,
      RangeStart = @RangeStart,
      RangeEnd   = @RangeEnd,
      MonthStart = DATEADD(MONTH, DATEDIFF(MONTH, 0, @RangeStart), 0)
    FROM numbers
    WHERE Number BETWEEN 0 AND DATEDIFF(MONTH, @RnageStart, @RangeEnd)
  ) m
) m

作为 numbers 表的临时替代品,您可以使用master..spt_valuessystem 表,或者更准确地说,它的特定子集 where type = 'P'。所以,你可以FROM numbers用这个子选择替换上面的:

FROM (
  SELECT Number
  FROM master..spt_values
  WHERE type = 'P'
) numbers
于 2012-05-30T05:05:01.093 回答