Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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_Tsql_Date - Fatal编程技术网

SQL-按年、月、日分组的日期-更新

SQL-按年、月、日分组的日期-更新,sql,sql-server,tsql,date,Sql,Sql Server,Tsql,Date,我使用代码按年份、月份、日期计算两个日期组之间的差异: ;WITH calendar AS ( SELECT CAST(MIN([From date]) as datetime) as d, MAX([To date]) as e FROM ItemTable UNION ALL SELECT DATEADD(day,1,d), e FROM calendar WHERE d < e ), cte AS( SELECT i.Item, DATEPART(yea

我使用代码按年份、月份、日期计算两个日期组之间的差异:

;WITH calendar AS (
SELECT  CAST(MIN([From date]) as datetime) as d,
    MAX([To date]) as e
FROM ItemTable
UNION ALL
SELECT  DATEADD(day,1,d),
    e
FROM calendar
WHERE d < e
), cte AS(
SELECT  i.Item,
    DATEPART(year,c.d) as [Year],
    DATEDIFF(month,MIN(c.d),MAX(c.d)) as NoOfMonth,
    DATEDIFF(day,DATEADD(month,DATEDIFF(month,MIN(c.d),MAX(c.d)),MIN(c.d)), 
  MAX(c.d)) as NoOfDays
FROM ItemTable i
INNER JOIN calendar c
ON c.d between i.[From date] and i.[To date]
GROUP BY i.Item, DATEPART(year,c.d),[From date],[To date]
)

SELECT  Item,
    [Year],
    SUM(NoOfMonth) as NoOfMonth,
    SUM(NoOfDays) as NoOfDays
FROM cte
GROUP BY Item,[Year]
ORDER BY Item
OPTION (MAXRECURSION 0)
我得到

('A1','2013-08-27','2013-09-27'),
('A1','2013-09-28','2013-11-28'),
('A1','2013-11-30','2013-12-03'),
('A1','2013-12-31','2014-03-31'),
('A1','2014-04-01','2014-07-01'),
('A1','2014-07-02','2014-10-02'),
('A1','2014-10-03','2014-12-31')
以及何时从该链接执行代码

我明白了:

 Item      Year         NoOfMonth     NoOfDays 
  A1        2013           4             -27
  A2        2014           10            58
这不好。。。。2013年应为3个月零4天, 2014年为11个月28天


如何更新代码以获得所需结果?

将上次选择更改为:

SELECT  Item,
        [Year],
        CASE WHEN SUM(NoOfDays) < 0 THEN SUM(NoOfMonth)-1 
            WHEN SUM(NoOfDays) > 30 THEN SUM(NoOfMonth)+1 
            ELSE SUM(NoOfMonth) END as NoOfMonth,
        CASE WHEN SUM(NoOfDays) >= 30 THEN SUM(NoOfDays)-30 
            WHEN SUM(NoOfDays) < 0 THEN SUM(NoOfDays)+30
            ELSE SUM(NoOfDays) END as NoOfDays
FROM cte
GROUP BY Item,[Year]
ORDER BY Item
OPTION (MAXRECURSION 0)
选择项目,
[年],
如果总和(NoOfDays)<0,则总和(NoOfMonth)-1
当总和(NoOfDays)>30时,则总和(NoOfMonth)+1
ELSE总和(NoOfMonth)结束为NoOfMonth,
如果总和(NoOfDays)>=30,则总和(NoOfDays)-30
当总和(NoOfDays)<0时,则总和(NoOfDays)+30
ELSE总和(NoOfDays)以NoOfDays结束
来自cte
按项目分组[年度]
逐项订购
选项(最大递归0)
这种报告的主要问题是很难定义什么是1个月,DATEDIFF只是从两个日期中取一个数字,然后从另一个日期中减去一个


我选择了30作为月份的天数,现在我将天数的值与30进行比较,以便在天数低于零或低于30时,我们可以将
+1
添加到月份中

SELECT  Item,
        [Year],
        CASE WHEN SUM(NoOfDays) < 0 THEN SUM(NoOfMonth)-1 
            WHEN SUM(NoOfDays) > 30 THEN SUM(NoOfMonth)+1 
            ELSE SUM(NoOfMonth) END as NoOfMonth,
        CASE WHEN SUM(NoOfDays) >= 30 THEN SUM(NoOfDays)-30 
            WHEN SUM(NoOfDays) < 0 THEN SUM(NoOfDays)+30
            ELSE SUM(NoOfDays) END as NoOfDays
FROM cte
GROUP BY Item,[Year]
ORDER BY Item
OPTION (MAXRECURSION 0)
选择项目,
[年],
如果总和(NoOfDays)<0,则总和(NoOfMonth)-1
当总和(NoOfDays)>30时,则总和(NoOfMonth)+1
ELSE总和(NoOfMonth)结束为NoOfMonth,
如果总和(NoOfDays)>=30,则总和(NoOfDays)-30
当总和(NoOfDays)<0时,则总和(NoOfDays)+30
ELSE总和(NoOfDays)以NoOfDays结束
来自cte
按项目分组[年度]
逐项订购
选项(最大递归0)
这种报告的主要问题是很难定义什么是1个月,DATEDIFF只是从两个日期中取一个数字,然后从另一个日期中减去一个


我选择了30作为月份的天数计数,现在我将天数的值与30进行比较,这样我们就可以将
+1
添加到月份中,如果天数计数低于零或低于30

谢谢,我只是在SUM(NoOfDays)>30时编辑这个案例,然后SUM(NoOfMonth)+1 ELSE SUM(NoOfMonth)结束为NoOfMonth,SUM(NoOfDays)时编辑这个案例<0 THEN SUM(NoOfMonth)-1 ELSE SUM(NoOfMonth)结束为NoOfMonth,当SUM(NoOfDays)>=30 THEN SUM(NoOfDays)-30当SUM(NoOfDays)<0 THEN SUM(NoOfDays)+30 ELSE SUM(NoOfDays)结束为NoOfDays谢谢,我只是在SUM(NoOfDays)>30 THEN SUM(NoOfMonth)时编辑这个案例+1其他总和(NoOfMonth)结束为NoOfMonth,如果总和(NoOfDays)<0,则为NoOfMonth)-1其他总和(NoOfMonth)结束为NoOfMonth,如果总和(NoOfDays)>=30,则为NoOfDays)-30当总和(NoOfDays)<0,则为NoOfDays)+30其他总和(NoOfDays)结束为NoOfDays