Sql 如何将日期拆分为月份
使用SQLServer2000 我想按月保存详细信息 用户输入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/
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