2

首先,感谢大家的帮助昨天。设置我要开始日期基于/的开始日期和时间日期查询

我设法让我的报告工作(到目前为止),所以现在我需要显示日期时间(FROM:在我的头TO :)。下面是该查询:

Declare @startdate datetime 
Declare @enddate datetime 
Declare @BeginningDate datetime 

set @BeginningDate = '12-01-2011' 

IF Month(@BeginningDate) < (Month(GETDATE())-1)--(YTD) 
BEGIN 
set @startdate = DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) 
set @enddate = dateadd(day, datediff(day, 0, getdate()), 0) 
END 

IF Month(@BeginningDate) = (Month(GETDATE())-1)--(MTD) 
BEGIN 
set @startdate = dateadd (mm,-1, 
    DATEADD(dd,-(DAY(DATEADD(mm,1,convert(varchar(10),getdate(),111)))-1), 
    DATEADD(mm,0,convert(varchar(10),getdate(),111))))--BEGINNING OF PRIOR MONTH 
set @enddate =DATEADD(dd,-1, 
    DATEADD(mm, 
    DATEDIFF(m,0,convert(varchar(10),getdate(),111)),0))--END OF PRIOR MONTH 
END 


IF Month(@BeginningDate) = (Month(GETDATE()))--(Current Period) 
BEGIN 
set @startdate = dateadd(month, datediff(month, 0, 
    dateadd(day, datediff(day, 1, getdate()), 0)), 0)--BEGINNING OF CURRENT MONTH 
set @enddate = dateadd(day, 
    datediff(day, 0, getdate()), 0)--THROUGH CURRENT MONTH (TODAY) 
END 

如果用户输入的日期11/27/201112-03-2011作为搜索参数,然后我的头应该显示FROM: 11/01/2011 TO:11/30/2011 (MTD)。如果他们选择,例如,12/01/201112/08/2011,那么我只需要这些日期(当前时期)。如果用户输入10/01/2011-12/8/2011,则该期间将从01/01/2011 to 12/8/2011 (YTD)

我怎么会在SSRS其设置为一个表达式?我是否需要根据这些输入创建一个数据集,然后调用一个参数?我已经用一个日期时间框架完成了这个工作,但从来没有像这样的时间框架问题。

在此先感谢!

UPDATE:这是什么,我想在我SSRS表达式来完成:

="FROM:"&iif(Month(Parameters!BeginningDate.Value < (Month(today()-1)) THEN (DateAdd("d",-DatePart(DateInterval.DayOfYear,Today(),0,0)+1,Today())).tostring("dd/MM/yyyy")+"  "+"TO:today()" 

如果用户选择一个开始日期比上月更大(如10/1),然后返回日期应是1/1/201112/16/2011

我希望这个澄清的事情。

谢谢!

+0

@Ken白色。你如何通过这种方式获得“高精简版”的日期?你是否像缩放代码一样缩进?仍然试图在这里学习交易的所有技巧,以最大限度地减少火焰:D谢谢! –

+0

反斜杠(后面的撇号,与美国键盘上'〜Esc'下面的〜相同的键)围绕它们,将它们视为内联代码。 –

+0

谢谢!当我在前面的问题中注意到这个时,我忘了问这个问题。 –

回答

3

我之前张贴了这个,你需要使用的数据集,你可以调用最新的功能。看看你是否可以按照这个:SQL Server: calculating date ranges它的奇迹。具体看看For Reporting Services Folks的部分。

对你来说将是非常简单的,如果他们选择2011/11/27并要返回11/1/2011你只需要调用它轮流调用函数MONTH_START数据集。它在该线程中都有很好的记录并广泛使用。

它的JIST是你需要在RS这样的功能:

CREATE FUNCTION [dbo].[udfCommonDates] (@date datetime) 
RETURNS @t table (week_start datetime, 
        week_end datetime, 
        lastweek_start datetime, 
        lastweek_end datetime, 
        month_start datetime, 
        month_end datetime, 
        lastmonth_start datetime, 
        lastmonth_end datetime, 
        yesterday_start datetime, 
        yesterday_end datetime, 
        today_start datetime, 
        today_end datetime, 
        thisweek_monday_start datetime, 
        thisweek_monday_end datetime, 
        year_start datetime, 
        year_end datetime, 
        tomorrow_noon datetime, 
        today_noon datetime, 
        date_only datetime) 
BEGIN 
    INSERT @t 
    SELECT 
    dbo.get_week_start (@date) AS week_start, 
    dbo.get_week_end (@date) AS week_end, 
    dbo.get_week_start (DATEADD(d, -7, @date)) AS lastweek_start, 
    dbo.get_week_end (DATEADD(d, -7, @date)) AS lastweek_end, 
    dbo.get_month_start(@date) AS month_start, 
    dbo.get_month_end (@date) AS month_end, 
    dbo.get_month_start (DATEADD(m,-1, @date)) AS lastmonth_start, 
    dbo.get_month_end (DATEADD(m,-1,@date)) AS lastmonth_end, 
    dbo.get_yesterday_start (@date) AS yesterday_start, 
    dbo.get_yesterday_end (@date) AS yesterday_end, 
    dbo.get_today_start (@date) AS today_start, 
    dbo.get_today_end (@date) AS today_end, 
    dbo.get_weekday_start(1,@date) AS thisweek_monday_start, 
    dbo.get_weekday_end(1,@date) AS thisweek_monday_end, 
    dbo.get_year_start(@date) AS year_start, 
    dbo.get_year_end(@date) AS year_end, 
    dbo.get_tomorrow_noon(@date) AS TomorrowNoon, 
    dbo.get_today_noon(@date) AS TodayNoon, 
    dbo.get_date_only(@date) AS DateOnly 
RETURN 
END 

然后,你需要的标量值的函数为每一个:

CREATE FUNCTION [dbo].[get_date_only] (@date datetime) 
    RETURNS datetime 
    WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 
    AS  
    BEGIN 
     RETURN dateadd(day, DateDiff(day, 0, GetDate()), 0) 
    END 
    GO 

CREATE FUNCTION [dbo].[get_month_end] (@date datetime) 
RETURNS datetime 
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 
AS  
BEGIN 
    RETURN dateadd(ms, -3, dateadd (m,datediff(m,0, 
      dateadd(m,1,@date)),0)) 
END 
GO 

CREATE FUNCTION [dbo].[get_month_start] (@date datetime) 
RETURNS datetime 
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 
AS  
BEGIN 
    RETURN dateadd(m,datediff(m,0, @date),0) 
    END 
GO 

CREATE FUNCTION [dbo].[get_today_end] (@today datetime) 
RETURNS datetime 
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 
AS  
BEGIN 
    return dateadd(ms, -3, datediff(d,0,dateadd(d,1,@today))) 
END 
GO 

CREATE FUNCTION [dbo].[get_today_noon](@date datetime) 
RETURNS datetime 
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 
AS BEGIN 
    RETURN DATEADD(hh, 12, DATEADD(d,DATEDIFF(d,0, @date),0)) 
END 
GO 

CREATE FUNCTION [dbo].[get_today_start] (@today datetime) 
RETURNS datetime 
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 
AS BEGIN 
    return dateadd(day, 0, datediff(d,0,@today)) 
END 
GO 

CREATE FUNCTION [dbo].[get_tomorrow_noon](@date datetime) 
RETURNS datetime 
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 
AS BEGIN 
    RETURN DATEADD(hh, 12, DATEADD(d,DATEDIFF(d,-1, @date),0)) 
END 
GO 

CREATE FUNCTION [dbo].[get_week_end] (@date datetime) 
RETURNS datetime 
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 
AS BEGIN 
    return dateadd(yyyy, datepart(yyyy, 
     dateadd(weekday,7-datepart(weekday, @date),@date))-1900, 0) 
    + dateadd(ms, -3, 
     dateadd(dy, datepart(dy, 
    dateadd(weekday,7-datepart(weekday, @date),@date)),0)) 
END 
GO 

CREATE FUNCTION [dbo].[get_week_start] (@date datetime) 
RETURNS datetime 
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 
AS BEGIN 
    return dateadd(yyyy, datepart(yyyy, 
     dateadd(weekday,1-datepart(weekday, @date),@date))-1900, 0) 
    + dateadd(dy, datepart(dy, 
     dateadd(weekday,1-datepart(weekday, @date),@date))-1,0) 
END 
GO 

CREATE FUNCTION [dbo].[get_weekday_end] (@weekday tinyint, 
           @date datetime) 
RETURNS datetime 
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 
AS BEGIN 
    return dateadd(yyyy, datepart(yyyy, 
     dateadd(weekday,@weekday- 
     datepart(weekday, @date),@date))-1900, 0) 
    + dateadd(ms, -3, 
     dateadd(dy, datepart(dy, 
     dateadd(weekday,@weekday-datepart(weekday, @date), 
             @date)),0)) 
END 
GO 

CREATE FUNCTION [dbo].[get_weekday_start] (@weekday tinyint, 
            @date datetime) 
RETURNS datetime 
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 
AS BEGIN 
    return dateadd(yyyy, datepart(yyyy, 
     dateadd(weekday,@weekday- 
     datepart(weekday, @date),@date))-1900, 0) 
    + dateadd(dy, datepart(dy, 
     dateadd(weekday,@weekday-datepart(weekday, @date), 
             @date))-1,0) 
END 
GO 

CREATE FUNCTION [dbo].[get_year_end] (@date datetime) 
RETURNS datetime 
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 
AS BEGIN 
RETURN DATEADD(year, DATEDIFF(year, 0, GetDate())+1, 0)-1 
END 
GO 

CREATE FUNCTION [dbo].[get_year_start] (@date datetime) 
RETURNS datetime 
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 
AS BEGIN 
    RETURN DATEADD(year,DATEDIFF(year,0, @date),0) 
END 
GO 

CREATE FUNCTION [dbo].[get_yesterday_end] (@today datetime) 
RETURNS datetime 
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 
AS BEGIN 
    return dateadd(ms, -3, datediff(d,0,@today)) 
END 
GO 

CREATE FUNCTION [dbo].[get_yesterday_start] (@today datetime) 
RETURNS datetime 
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 
AS BEGIN 
    RETURN dateadd(day, -1, datediff(d,0,@today)) 
END 
GO 

艰苦的工作现在是报告服务完成记住一个数据集可以是一个存储过程或一个直接表。所以,你会简单地创建存储过程:

CREATE PROCEDURE [dbo].[uspCommonDates] AS 
begin 
    set datefirst 1 
    declare @date datetime 
    set @date = getdate() 
    select * from dbo.udfCommonDates(@date) 
end 

,并使用该存储过程作为一个dataset。所以现在你可以访问所有这些不错的日期函数。所以,你现在可以去你的参数部分,调用这些函数,像这样:

enter image description here

相关问题