sql - 如何根据用户在 SQL 中输入的内容将日期时间拆分为周/月

标签 sql sql-server date datetime split

我正在创建一个报告,该报告将使用一个条形图,该条形图将根据用户在开始日期和结束日期中输入的内容进行分割。

如果用户输入的开始日期和结束日期少于 8 周,则该日期将被拆分为几周,但如果是 8 周或更长,则该日期将被拆分为几个月。

例如如果用户输入像 01/11/2013 - 30/11/2013 这样的日期,那么它将被分为 01/11/2013 - 03/11/2013、04/11/2013 - 10/11/2013、11/11/2013 - 17/11/2013, 18/11/2013 - 24/11/2013, 25/11/2013 - 30/11/2013

但是如果输入像 01/05/2013 - 30/11/2013 这样的日期,它将分为 01/05/2013 - 31/05/2013、01/06/2013 - 30/06/2013 等等上。

我的参数有 @StartDate 和 @EndDate,我环顾四周并尝试了许多不同的方法,但无法让它工作,任何帮助都会很棒!

谢谢

托马斯·詹姆斯

最佳答案

给你..

declare @startDate datetime='09/01/2013'
declare @endDate datetime='11/30/2013'
DECLARE @WEEKCOUNT INT
declare @magic int

SELECT @WEEKCOUNT = DATEDIFF(WEEK,@startDate,@endDate)
SELECT @magic = case when @WEEKCOUNT<8 then @WEEKCOUNT else (month(@endDate)-month(@startDate))+1 end


;WITH CTESplit
as
(
    select 1 as weekcount,
    CASE WHEN @WEEKCOUNT < 8 THEN DATEADD(dd, -(DATEPART(dw, @startDate))+1, @startDate) 
    ELSE DATEADD(dd, -(DAY(@startDate)-1), @startDate) END  [WeekStart], 
    CASE WHEN @WEEKCOUNT < 8 THEN DATEADD(dd, 7-(DATEPART(dw, @startDate))+1, @startDate) 
    else DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@startDate)+1,0)) end [WeekEnd]


    union all

    select a.weekcount+1 as weekcount,
    CASE WHEN @WEEKCOUNT < 8 THEN DATEADD(dd, -(DATEPART(dw, @startDate+(7*(a.weekcount+1))))+2, @startDate+(7*(a.weekcount+1))) 
    ELSE DATEADD(dd, -(DAY(@startDate+(30*(a.weekcount+1)))-1), @startDate+(30*(a.weekcount+1))) END  [WeekStart], 
    CASE WHEN @WEEKCOUNT < 8 THEN DATEADD(dd, 7-(DATEPART(dw, @startDate+(7*(a.weekcount+1))))+1, @startDate+(7*(a.weekcount+1))) 
    else DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@startDate+(30*(a.weekcount+1)))+1,0)) end [WeekEnd]
    from CTESplit a where (a.weekcount+1)<=@magic



)

select * from CTESplit

关于sql - 如何根据用户在 SQL 中输入的内容将日期时间拆分为周/月,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20214576/

相关文章:

sql - 在 JOIN 之后添加简单的 AND 会降低性能

sql-server - 创建 MSSQL 存储过程以检查 TableA 记录计数。然后将 TableA 记录插入到 TableB

java - 如何强制日期在时区更改后不更改日期?

sql-server - ISDate 在 SQL Server 中未按预期工作

javascript - 如何在 AngularJS 中处理来自 REST Api 的日期字段?

algorithm - 在另一个时间段内迭代离散时间段

mysql - 在 mysql 中,我如何设置一个带有最后日期和时间的变量

MySQL 将 1 行链接到多个

sql - 如何确定 SQL 表(雪花)中出现次数最多的值并考虑关系?

php - MYSQL 搜索脚本 php 的错误结果