1

我正在使用 SQL Server。当我尝试使用 datepart 函数按周对信息进行排序时,它不返回任何值。我的表中有所选日期范围的值。

我尝试使用的查询是:

Declare @StartDate datetime, @EndDate datetime
set @StartDate = '20120401 00:00:00'
set @EndDate = '20120430 23:59:59'
;WITH
mytablePlusHours As
(
SELECT *,
    DATEPART(ww, [eci_date])     AS [dateWeek]
FROM    [mytable]    
)
, mytableHourGroups As
(
SELECT  dateWeek, 
        [eci_country],
        COUNT(*)        As [Number_Country],
        ROW_NUMBER() OVER(PARTITION BY dateWeek ORDER BY [eci_country])
                        As [Country_Rank]
FROM        mytablePlusHours
GROUP BY    dateWeek, [eci_country]
)
SELECT  
    dateWeek     AS [eci_date],
    [eci_country],
    [Number_Country]
FROM    mytableHourGroups WITH(NOLOCK)
WHERE   [dateWeek] between @StartDate and @EndDate
ORDER BY [dateWeek], [Number_Country] DESC

我可以按天提取信息,但我不知道如何按周对其进行排序。有人可以告诉我我的代码哪里错了吗?谢谢!

我正在尝试显示我的数据,例如:

Week Country       Count
16   United States  13
17   Canada         41
4

2 回答 2

5

[DateWeek]不是日期,它是一个数字(1 到 53)。

任何一个...

将该WHERE子句移至您的第一个 CTE。

mytablePlusHours As
(
  SELECT *, DATEPART(ww, [eci_date])     AS [dateWeek]
    FROM [mytable]
   WHERE [eci_date] between @StartDate and @EndDate
)

或者,将 更改为DATEPART()返回日期的函数...

mytablePlusHours As
(
  SELECT *, DATEADD(WEEK, DATEDIFF(WEEK, 0, [eci_date]), 0) AS [dateWeek]
    FROM [mytable]
)
于 2012-04-24T20:51:41.460 回答
4

您正在将整数与日期进行比较。

DATEPART(ww...)返回数字周(即一年中的第三周为 3)。您的比较datetime是不可直接比较的。

您需要与日期的星期进行比较,还应该检查年份。只检查一周:

WHERE   [dateWeek] between  DATEPART(ww,@StartDate) and DATEPART(ww,@EndDate)

您应该将年份添加到您的 CTE 并进行比较,否则 2012 年 1 月 15 日和 2011 年 1 月 9 日都将出现在同一个“周”中。

于 2012-04-24T20:50:55.093 回答