Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将日期拆分为月份_Sql_Sql Server_Sql Server 2000 - Fatal编程技术网

Sql 如何将日期拆分为月份

Sql 如何将日期拆分为月份,sql,sql-server,sql-server-2000,Sql,Sql Server,Sql Server 2000,使用SQLServer2000 我想按月保存详细信息 用户输入 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 ..... 从用户条目中,我想在表1中插入详细信息,条件类似于fromdate和todate拆分为monthwise(mm/

使用SQLServer2000

我想按月保存详细信息

用户输入

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
.....
从用户条目中,我想在表1中插入详细信息,条件类似于fromdate和todate拆分为monthwise(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是
dd/mm/yyyyy
期间格式为
mm/yyyy

如何在sql server中执行此操作


需要sql查询帮助

首先,创建并填充一个包含以下列(至少):

然后,对于一对
fromdate
todate
,此查询将返回所需的数据,但您当然可以将其放入存储过程中,并在每个用户输入时调用它一次,或者以任何方式从应用程序执行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
声明@ID char(3),@FromDate datetime,@ToDate datetime
选择@ID='001',@FromDate='20120107',@ToDate='20120917'
选择
@ID为“ID”,
c、 期间,,
当c.IsFirstDayOfMonth=0x0时,则@FromDate else c.BaseDate以“FromDate”结束,
当@ToDate
您可以使用数字表()生成月份:

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

你可以得到一个月和一个月(fromdate)以及一年和一年(fromdate),但是你到目前为止尝试了什么?我希望您必须为此编写一个过程或表函数。请您更好地解释一下。是否要将详细信息存储在表中并从表中进行查询?
Fromdate
是否始终是一个月的第一天?它是否可以是不同的一天?我必须在日历表中输入哪些数据…?,我运行您的查询,没有错误,也没有输出…@JetJack您可以使用您想要的任何日期范围和列集填充表。您可以看到一个完整的示例,尽管您个人必须决定哪些列对您的查询有意义。将来添加更多的列很容易,所以不要觉得第一次就必须正确。如果您创建我描述的表并相应地填充它,那么查询将起作用。@JetJack我在我链接到的文章中向您展示了一个示例。您已经问了很多关于基于同一个表和数据集的日期处理和格式设置的问题,并得到了很多有用的答案。但在我看来,你仍然在问一些非常相似的问题。我不想说得太苛刻或无益,但请花些时间阅读并理解所有答案、所有相关文档以及人们提供的所有链接。然后,你的理解力的提高将允许你提出更精确的问题,从而得到更好的答案。
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
FROM (
  SELECT Number
  FROM master..spt_values
  WHERE type = 'P'
) numbers