【问题标题】:Set report date for date other than today in SQL reporting在 SQL 报告中为今天以外的日期设置报告日期
【发布时间】:2017-03-31 12:10:23
【问题描述】:

我有一份报告,我被要求制作。第一列数据是从年初到上个月月底输入的总时间。下一列数据是从“当前”月份开始到“当前”月份结束的总时间。

例如。如果此报告针对 3 月运行,则第一列将是 1 月和 2 月的总时间,第二列将是 3 月的总时间。如果我在四月运行它,那么第一列将是一月/二月/三月的总时间,第二列是四月的总时间,等等。

我正在使用各种表达式来获取一年中的第一个日期、上个月的最后一个日期、本月的第一个日期、本月的最后一个日期。一切正常,如果您在当月(即 3 月)运行报告,它运行起来就像做梦一样,但如果您想在 4 月为 3 月的数据运行报告,它不会这样做,因为它正在读取计算机上的日期和用它来计算上个月。

在 Crystal 报表中,您可以设置报表日期。 SQL 报告中有类似的东西吗?我假设您在初始查询中声明了报告日期,但我还没有找到正确的函数组合。

  • 此报告适用于我们运行的外部软件。
  • 我可以使用的唯一参数是@FromDate@ToDate,它们设置为文本而不是日期
  • 我打算使用@ToDate 来设置报告日期,但显然必须先将其从文本转换

非常感谢任何指导

【问题讨论】:

  • 当您说“总时间”时,您的意思是该列仅包含天数或其他内容吗?即对于二月 col1 将只是 31 而第 2 列将是 28?
  • 总时间为小时。因此,例如,每天 8 小时、连续 5 天、连续 4 周将是 160 小时

标签: sql-server date reporting-services


【解决方案1】:

试试这个。实际上,您可以在没有所有声明语句的情况下执行此操作,我只是将其分解为易于阅读。

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

【讨论】:

  • 哇!我认为这是一个简单的声明/设置函数。谢谢你。今天下午我会玩它
  • 只是为了跟进这一点,我尝试使用它,但我无法让它工作。我将此归结为我对 DATEADD 和 DATEDIFF 缺乏了解。我最终创建了两个报告。一个查看当前月份和年份到上个月(可以在该月的最后一天运行),另一个查看上个月和上一年到上一个 2 个月(可以在下个月的任何一天运行)您要报告的月份)。如果 SQL 开发人员正在观看 - 声明 report_date ToDate 参数会非常方便 - 谢谢。
【解决方案2】:

周末我想了想,意识到我在处理这个问题时完全错了。我试图设置报告日期,以便我的查询可以读取该日期,然后返回并查找相关日期(一年中的第一个日期、上个月的最后一个日期等)。

我需要做的是在我的 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,

现在好多了,因为我的“一年中的第一个日期”可以是用户想要的任何东西,而不仅仅是一年中的第一天。

【讨论】:

    猜你喜欢
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多