我有一份报告说我被要求制作。第一列数据是从一年的第一年到上个月末输入的总时间。下一列数据是从“当前”月份开始到“当前”月份结束的总时间。
例如。如果此报告在3月份运行,则第一列将是1月和2月的总时间,第二列将是3月的总时间。如果我在4月份运行它,那么第一列将是1月/ 2月/ 3月的总时间和第4列等于4月的总时间等。
我使用各种表达式来获取年度的第一个日期,上个月的上一个日期,本月的第一个日期,本月的最后一个日期。如果您在当月(即3月)运行报告,所有工作正常,它就像梦一样运行但如果您想在4月份运行3月份数据的报告,它将无法执行,因为它正在读取计算机上的日期和用它来计算上个月。
在Crystal报表中,您可以设置报表日期。 SQL报告中有类似的东西吗?我假设您在初始查询中声明了报告日期,但我还没有找到正确的功能组合。
@FromDate
和@ToDate
,这些参数设置为文字而非日期@ToDate
设置报告日期,但显然必须先从文本转换非常感谢任何指导
答案 0 :(得分:0)
试试这个。你可以在没有所有声明语句的情况下实现它,我只是将它们分解为易于阅读。
declare @date_entered datetime = '2/7/2017'
declare @start_of_year datetime = DATEADD(yy, DATEDIFF(yy, 0, @date_entered), 0)
declare @start_of_month datetime = DATEADD(month, DATEDIFF(month, 0, @date_entered), 0)
declare @end_of_month datetime = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@date_entered)+1,0))
declare @end_of_last_month datetime = DATEADD(day,-1,@start_of_month)
-- Now remove weekends from days found
declare @amount_of_days_previous tinyint = datediff(day,@start_of_year,@end_of_last_month) - (datediff(wk, @start_of_year, @end_of_last_month) * 2)
declare @amount_of_days_this tinyint = DATEDIFF(day,@start_of_month,@end_of_month) - (datediff(wk, @start_of_month, @end_of_month) * 2)
select @amount_of_days_previous * 8 as WorkHoursinDaysPrevious,
@amount_of_days_this * 8 as WorkHoursinDaysThis
答案 1 :(得分:0)
周末我有一个想法,并意识到我正在接近这个问题。我试图设置报告日期,以便我的查询可以读取该日期,然后返回并查找相关日期(年中的第一个日期,上个月的最后日期等)。
我需要做的是在我的DATEADD选择中使用我的日期条件(FromDate和ToDate)。
CONVERT(datetime,@FromDate,103) AS FIRSTDAYOFYEAR,
DATEADD(D, - 1, DATEADD(MONTH, DATEDIFF(MONTH, '19000101', CONVERT(datetime,@ToDate,103)), '19000101')) AS LASTDAYPREVMONTH,
DATEADD(MONTH,DATEDIFF(MONTH, '19000101',CONVERT(datetime,@ToDate,103)), '19000101') AS FIRSTDAYMONTH,
CONVERT(datetime,@ToDate,103) AS LASTDAYMONTH,
现在好多了,因为我的“一年中的第一个日期”可以是用户想要的任何东西,而不仅仅是一年的第一天。