查询按日历周分组/问题:日期扩展超过一年

时间:2015-02-05 15:19:33

标签: sql date ms-access-2007

我有一个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      |

2 个答案:

答案 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