我有一个SQL查询,它计算两个总和的引用。该报价应每周计算一次。因此使用Datepart('ww', Date, 2, 2)
来获取日历周。
这个查询在2014年运作良好,但现在我遇到了问题。
用户在日期选择器中选择日期选择器,然后在where子句中使用,仅选择相关记录。
如果他们选择过去一年(例如2014年)的日期和今年的日期,我的查询会显示不相关的数据,因为它不会影响当年的日历周。
那么,按日历周分组的方式如何只选择正确年份的记录。
SELECT DatePart('ww',Date,2,2) AS WEEK,
Year(Workload_Date) AS [YEAR],
(SUM(Value1)+SUM(Value2))AS [Total1],
(SUM(Value3)+SUM(Value4)) AS [Total2],
((SUM(Value1)+SUM(Value2))/(SUM(Value3)+SUM(Value4))) AS [Quote]
FROM tbl
WHERE DatePart('ww',Date,2,2) Between DatePart('ww',FromDatePickerField,2,2) And DatePart('ww',ToDatePickerField,2,2)
GROUP BY DatePart('ww',Date,2,2), Year(Date)
ORDER BY Year(Date), DatePart('ww',Date,2,2);
该表每天包含一条记录。
Date | Value1 | Value2 | Value3 | Value4 |
01.01.2014 | 4 | 3 | 2 | 3 |
02.01.2014 | 4 | 3 | 9 | 3 |
03.01.2014 | 4 | 3 | 4 | 1 |
04.01.2014 | 4 | 3 | 1 | 3 |
...
01.01.2015 | 4 | 3 | 6 | 3 |
02.01.2015 | 4 | 3 | 3 | 7 |
答案 0 :(得分:1)
您可以将您的逻辑基于Week_Ending_date
而不是周数和年份,这样您就可以每周聚合所有数据并让SQL处理周/年检测逻辑。
如果你有一个跨越2年的日期范围,即使这样,计算也将基于week_ending_date,并且应该正确运行。
像...一样的东西。
SELECT DATEADD(dd, 7-(DATEPART(dw, DATE)), DATE) AS WEEK_ENDING_DATE
,Year(DATEADD(dd, 7-(DATEPART(dw, DATE)), DATE)) AS [YEAR]
,(SUM(Value1) + SUM(Value2)) AS [Total1]
,(SUM(Value3) + SUM(Value4)) AS [Total2]
,((SUM(Value1) + SUM(Value2)) / (SUM(Value3) + SUM(Value4))) AS [Quote]
FROM tbl
WHERE DATEADD(dd, 7-(DATEPART(dw, DATE)), DATE) BETWEEN DATEADD(dd, 7-(DATEPART(dw, FromDatePickerField)), FromDatePickerField)
AND DATEADD(dd, 7-(DATEPART(dw, ToDatePickerField)), ToDatePickerField)
and date >= FromDatePickerField
and date <= ToDatePickerField
GROUP BY DATEADD(dd, 7-(DATEPART(dw, DATE)), DATE)
ORDER BY DATEADD(dd, 7-(DATEPART(dw, DATE)), DATE)
答案 1 :(得分:0)
我看到了两种可能的解决方案。
1)只要两个日期选择器的年份不同,就可以在表单上使用日期选择器时停止用户。也许是一个MsgBox或其他东西,
2)您将to-DatePicker更改为from-Year。
DECLARE @MinDate DATE = '01.11.2014'
DECLARE @tmpDate DATE = '12.02.2015'
DECLARE @MaxDate DATE = (CASE WHEN Year(@MinDate) != Year(@tmpDate) THEN Convert(DATE, '31.12.' + Convert(VARCHAR(4), Year(@MinDate))) ELSE @tmpDate END)
SELECT @MinDate, @tmpDate, @MaxDate
结果:
minDate tmpDate maxDate
01.11.2014 12.02.2015 31.12.2014