【问题标题】:TSQL select columns from rollup data columnsTSQL 从汇总数据列中选择列
【发布时间】:2014-08-06 23:59:40
【问题描述】:

我有一个汇总数据表,其中存储每日计数、每月计数和每年计数的数据。

“rollup_type”指定它是每日(1)/每月(2)/每年数据(3)。对于年度记录,monthl/daily 均为空。对于月度记录,daily 为空。

我正在尝试根据输入的开始日期和结束日期进行简单的 SELECT,但没有成功。这是我尝试过的,但无法正常工作。

declare @start_date datetime = '2013-02-01'
declare @enddate datetime = '2014-01-12'
   
select * from olr_rollup_data rd  
where ( rd.Year > DATEPART(YYYY, @start_date) or ( rd.Year = DATEPART(YYYY, @start_date) and ( (rd.Month > DATEPART(MM, @start_date) and rd.day is null) or (rd.MONTH = DATEPART(MM, @start_date) and rd.day >= DATEPART(DD, @start_date) ))))  
and   ( rd.Year < DATEPART(YYYY, @enddate) or ( rd.Year = DATEPART(YYYY, @enddate) and ( (rd.Month < DATEPART(MM, @enddate) and rd.day is null) or ( rd.MONTH = DATEPART(MM, @enddate) and rd.Day <= DATEPART(DD, @enddate) ))))

基本上,一个通用的选择语句将使用来自输入日期的每日、每月和每年数据的组合。当输入日期覆盖整月时,它应该选择天加整月,依此类推。

如果您能帮助找出正确的选择语句,我将不胜感激。谢谢。

【问题讨论】:

标签: sql date sql-server-2012


【解决方案1】:

使用日期总是很痛苦,这就是为什么在可用时使用内置日期时间函数很好的原因。遗憾的是,这在这里行不通,我们必须想出一些技巧。

将日期用作“数字”的一种方法是将年份乘以 10000,月份乘以 100,然后将这些数字添加到月份中的某天。这会给你一个整数,其中的数字看起来像这样

YYYYMMDD

虽然不相交(有很多整数你永远看不到),但任何具有这种表示形式的整数都具有与其表示的日期相同的基数(那些作为日期较大的整数也作为整数较大。)

我们可以通过以下方式解决您的问题:

DECLARE @startDate INTEGER = 20130201
DECLARE @endDate INTEGER = 20140112


SELECT * 
FROM 
 (
   SELECT ((year*10000)+(ISNULL(month,0)*100)+ISNULL(day,0)) as dateInt, *
   FROM olr_rollup_date
 ) sub
 WHERE dateInt >= @startDate AND dateInt <= @endDate

这将包括被“包围”的月份的汇总行。由于我们将 null 值默认为每月 0,因此 2014 年 5 月的 null 值将是 20140500。这大于 4 月的任何日期,小于 6 月的任何日期,但小于 5 月的任何日期。

年会以类似的方式运作。

【讨论】:

  • 我不知道我的问题是否清楚,但只有在完全覆盖时才应该选择整月,否则只有几天。因此,对于 2/2/2013 - 5/3/2013,它应该有每个三月、四月的记录,然后是二月和五月的剩余每日记录。基本上基于输入日期期间的最小记录。上面的查询即使是部分月份日期也会选择整月。
  • 感谢您的回复和帮助,但以上也无法正常工作。当 dayStart
  • @user704988 - 请查看修改后的答案。
猜你喜欢
  • 1970-01-01
  • 2020-01-16
  • 2020-08-22
  • 1970-01-01
  • 2021-06-08
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
相关资源
最近更新 更多