2011-03-03 100 views
0

我需要做一個簡單的查詢數我有多少記錄有時間 一個特定時期如天,月,年, 僞例如:查詢的SQL GROUP BY期

SELECT COUNT(EmployeeID) 
FROM HumanResources.Employees 
WHERE Hire Date.YEAR = 'year' 
GROUP BY Hire Date.YEAR 

驗證碼不起作用,應該是什麼?

+0

你有什麼問題嗎? – user492238 2011-03-03 09:19:53

+0

-1什麼問題? – DHN 2011-03-03 09:19:58

回答

0

下面是該查詢

select COUNT(EmployeeID) 
from HumanResources.Employees 
where year(Hire Date)=2011 
    and month(Hire Date)=03 
group by Hire Date 

如果你想日期範圍

select COUNT(EmployeeID) 
from HumanResources.Employees 
where Hire date between '2011/03/01' and '2011/03/03' 
group by Hire Date 
0

之間查詢看看在SQL Server DATEPART函數

WHERE DatePart(y, [Hire Date]) = 2011 
GROUP BY DatePart(y, [Hire Date]) 

可以替代ÿ與一些日期部分(月,季,周,日,星期幾等)

1

您可以使用YEAR()和MONTH()函數將信息拆分爲句點。

例如:

SELECT YEAR(Hire Date), MONTH(Hire Date), COUNT(EmployeeID) FROM 
HumanResources.Employees WHERE YEAR(Hire Date) = 'year' 
GROUP BY YEAR(Hire Date),MONTH(Hire Date) 
+0

你是對的,但刪除(。)點,並使用空間相同的列名稱作爲用戶類型'Hire Date'而不是'Hire.Date' – 2011-03-03 09:59:13

0

假設你可以建立你希望計算,則記錄我會使用BETWEEN操作範圍的開始和結束日期。

SELECT COUNT(EmployeeID) 
FROM Employees emp 
WHERE HireDate BETWEEN @rangeStartDate AND @rangeEndDate 

如果具有不同範圍的工作是你所需要的部分,假設你是純粹的T-SQL這樣做,那麼你可以使用DATEADD函數基於一個特定的偏移來計算範圍結束日期和一個已知的範圍開始日期。

0

例如找到2010年僱用的員工數量:

SELECT COUNT(EmployeeID) 
FROM HumanResources.Employees 
WHERE [Hire Date] >= '20100101' AND [Hire Date] < '20110101' 

這樣做會意味着如果在聘用日期有索引,它將被使用(更好的性能)。只要您開始操作正在搜索的列(例如使用YEAR()或MONTH()函數),就會失去使用索引的能力。

這是你之後的事情嗎?

+0

BETWEEN運算符沒有需要基於文本的日期字段不會實現相同的事情。 – OtisAardvark 2011-03-03 09:26:13

+0

BETWEEN包含結束日期*,因此任何包含Hire Date = 20110101 00:00:00的記錄都將被包括在內,這將是錯誤的。另外,理想情況下,這可以用DATETIME變量進行參數化(沒有爲簡明起見而顯示)。但在上面,我指定的2個日期字符串會隱式轉換一次到DATETIMEs,然後匹配隱藏日期字段 – AdaTheDev 2011-03-03 09:28:18

+0

...並且這些不是基於文本的日期字段。它是每個本地化版本在T-SQL中使用類型日期的工作方式。字段[Hire Date]仍然是一個日期字段 - 只是靜態值以文本表示形式給出。 – 2011-03-03 09:32:10

0

如果你正在尋找的是將其轉換爲LINQ到SQL,下面應該工作:

var count = (from e in HumanResourcesDataContext.Employees 
      where e.HireDate.Year = 2011 // or whatever you want it to be 
      select e).Count();