2011-08-08 41 views
1

我有这样的桌子;如何搜索日期列并将其按日期列组分组?

jobID - jobTitle - jobCreatedDate

我想有可能使游客在作业表搜索,并通过这样的分组列出它,我想只有一个SQL查询来做到这一点:

Date Added 
- AnyTime (20) 
- 1 day ago (5) 
- 2-7 days ago (2) 
- 8-14 days ago (0) 
- 15-30 days ago (7) 

我试着Group by“jobCreatedDate”没有成功,我无法理解必要查询的逻辑。

这里就是我试图做一个例子:

Here is an example

感谢您的帮助。

回答

2

你需要找到today和现场JobCreated之间的时间差。然后根据价值天数的差异,您需要将输出相应分类为各种类别以满足您的要求。

我希望这是你在找什么。

SELECT SUM(1) AS [AnyTime] 
    , SUM(CASE WHEN DayCount = 1     THEN 1 ELSE 0 END) AS [1 day ago] 
    , SUM(CASE WHEN DayCount BETWEEN 2 AND 7  THEN 1 ELSE 0 END) AS [2-7 days ago] 
    , SUM(CASE WHEN DayCount BETWEEN 8 AND 14  THEN 1 ELSE 0 END) AS [8-14 days ago] 
    , SUM(CASE WHEN DayCount BETWEEN 15 AND 30 THEN 1 ELSE 0 END) AS [15-30 days ago] 
FROM  
(
    SELECT  JobID 
      , DATEDIFF(d, JobCreatedDate, GETDATE()) AS DayCount 
    FROM  dbo.Jobs 
) Jobs 

该屏幕截图显示了示例数据和查询输出。

Output

+0

正是我需要的!谢谢 –

0

使用DATEADD tsql方法。

Select ... 
From [Table] 
Where JobCreatedDate between DATEADD(dd, @NumDays, GetDate()) and GetDate() 

在此查询中@NumDays是一个参数,表示从当前日期中减去的天数。确保你传递一个负数的查询。如果您尝试创建非包含范围,则需要使用两个将查询的两个参数传递给DATEADD的调用。

编辑 我误解了你正在尝试做的事情。这可能不是最优雅的解决方案,但您可以使用联合查询来实现您的目标。

Select sum(OneDay) as OneDay, sum(SevenDays) as SevenDays 
From 
(select 1 as OneDay, 0 as SevenDays 
    From [table] 
    Where JobCreatedDate between DATEADD(dd, -1, GetDate()) and GetDate()) 
    UNION 
(select 0 as OneDay, 1 as SevenDays 
    From[table] 
    Where JobCreatedDate between DATEADD(dd, -7, GetDate()) and DATEADD(dd, -2, GetDate())) 
+0

谢谢,但您的查询只选择1日期之间的数据。我知道如何选择开始和结束日期之间的数据,但我需要使用一个查询选择多个日期之间的数据计数。我想我应该使用CASE或者,我不知道:) 例如;首先选择今天和1周前,然后1周前和2周前等数据的计数。在这之后,数据的结果由高到低排列。 –