如何在2个日期点之间返回空日期 [英] How to return empty dates between 2 date points

查看:114
本文介绍了如何在2个日期点之间返回空日期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好。



我正在为办公室创建一个工作流程数据库,因此我们需要查看一周中每一天的计划工作。 br />


我将在下面简要介绍的存储过程仅显示我们有数据的日期。但是,如果我也希望看到日期,即使没有这样的日期数据,我还需要进行哪些更改。



我正在使用动态SQL所以当你进入本周的第二天时,列和日期会自动向上移动。



我希望这是有道理的。

非常感谢。



Hi Everyone one.

I am creating a workflow database for the office and hence we need to see what work is planned for each day of the week.

The stored proc I will shortly give below will only show the date for which we have data. However, what changes do I need to make if I also want to see dates even if there is no data for such a date.

I am using dynamic SQL so the columns and hence dates automatically shift up as you progress to the next day in the week.

I hope that makes sense.

many thanks.

ALTER PROCEDURE [dbo].[spTotalRunsPerWeek]
AS

CREATE TABLE #ResultsDateSet
(
  DateRun VARCHAR(MAX)
)

INSERT INTO #ResultsDateSet
Select convert(varchar(10), EstimatedCompletionDate, 111)
from tbRun r
left outer join tbProject p on p.ProjectID = r.ProjectID
left outer join tbFK_UserProject fk on fk.ProjectID = p.ProjectID
left outer join tbUser u on u.UserID = fk.UserID
left outer join tbRole ro on ro.RoleID = fk.RoleID
left outer join tbExecution e on e.ExecutionID = p.ExecutionID
WHERE UserName <> 'NA' and ro.RoleID = 2
and EstimatedCompletionDate >= DATEADD(day,-1,GETDATE())
and EstimatedCompletionDate <= DATEADD(day,14,GETDATE())
group by convert(varchar(10), EstimatedCompletionDate, 111)
order by convert(varchar(10), EstimatedCompletionDate, 111)

DECLARE @PivotColumnHeaders VARCHAR(MAX)
SELECT @PivotColumnHeaders = 
  COALESCE(
     @PivotColumnHeaders + ',[' + cast(DateRun as varchar) + ']',
     '[' + cast(DateRun as varchar)+ ']'
   )
 FROM #ResultsDateSet
 ORDER BY DateRun

DECLARE @PivotTableSQL NVARCHAR(MAX)
 SET @PivotTableSQL = N'
 
CREATE TABLE #Results
(
  UserName VARCHAR(MAX),
  ProjectName VARCHAR(MAX),
  ExecutionName VARCHAR(MAX),
  DateRun VARCHAR(MAX),
  TotalRuns INT
)

INSERT INTO #Results
Select u.FirstName + '' '' + u.Surname as UserName, ProjectName, ExecutionName,
       convert(varchar(10), EstimatedCompletionDate, 111),
Count(r.RunNumber)
from tbRun r
left outer join tbProject p on p.ProjectID = r.ProjectID
left outer join tbFK_UserProject fk on fk.ProjectID = p.ProjectID
left outer join tbUser u on u.UserID = fk.UserID
left outer join tbRole ro on ro.RoleID = fk.RoleID
left outer join tbExecution e on e.ExecutionID = p.ExecutionID
WHERE UserName <> ''NA'' and ro.RoleID = 2
group by u.FirstName, u.Surname, ProjectName, ExecutionName,convert(varchar(10), EstimatedCompletionDate, 111)
order by u.FirstName, u.Surname, ProjectName, ExecutionName,convert(varchar(10), EstimatedCompletionDate, 111)

SELECT *
FROM #Results
PIVOT (sum(TotalRuns)for DateRun in (' + @PivotColumnHeaders + ')) As Result

DROP TABLE #Results
'

EXECUTE(@PivotTableSQL)

DROP TABLE #ResultsDateSet

推荐答案

可能不是你的后续但你可以使用RCT(递归公用表表达式)来创建一个多重你需要的每一行的行,然后右外连接到它



参见示例b elow



might not be what your after but you could use a RCT(recursive common table expresion) to create a multiple rows for everydate you need and then right outer join to it

see example below

declare @tables table (dates datetime);
with dates as (
    SELECT CAST('2012-01-01' as datetime) as addtome
    UNION ALL
    SELECT DATEADD(day,1,addtome) FROM dates where DATEPART(year,addtome) = 2012
    )


INSERT INTO @tables SELECT addtome FROM dates OPTION (MAXRECURSION 366)







然后在你的select语句中添加如下所示的连接




then in your select statement add a join as below

RIGHT OUTER JOIN @tables t on t.date =


正如Dec90所写,看起来您需要日期范围内的所有日期。



枚举日期范围内所有日期的其他解决方案是使用循环:

As Dec90 wrote, it looks like you need all dates in date range.

Other solution to enum all dates in date range is to use loop:
DECLARE @begDate DATETIME
DECLARE @endDate DATETIME
DECLARE @curDate DATETIME

DECLARE @dTable TABLE(aDate DATETIME)

SET @begDate = '2013-01-01'
SET @endDate = GETDATE()

SET @curDate = DATEADD(day,-1,@begDate)
WHILE (@curDate < @endDate)
BEGIN
	SET @curDate = DATEADD(day,1,@curDate)
	INSERT INTO @dTable VALUES(@curDate)
END

SELECT *
FROM @dTable


这篇关于如何在2个日期点之间返回空日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆