2012-01-18 20 views
1

我有一個日期時間字段,我想白天從8:00小時的所有記錄數到9:00的範圍的日期來算由特定小時一天記錄的日期範圍(即:從:01/01/2012到:01/03/2012)。如何使用SQL

舉例來說,如果我有以下數據:

2012-01-01 08:26 
2012-01-01 08:40 
2012-01-01 09:26 
2012-01-01 10:26 
2012-01-02 08:06 
2012-01-02 09:26 
2012-01-02 09:40 
2012-01-03 08:30 
2012-01-03 10:26 

的結果應該是這樣的:

2012-01-01 2 
2012-01-02 1 
2012-01-03 1 

編輯: 這裏是我使用@gbn溶液(它的工作原理對我而言)

SELECT COUNT(*), convert(varchar(10),ScanDate,101) 
FROM tblSingleBox (nolock) 
WHERE DATEPART(Hour, scandate) = 8 
    and (scandate>='01/03/2012' and scandate<'01/05/2012') 
GROUP BY convert(varchar(10),ScanDate,101) 
order by convert(varchar(10),ScanDate,101) 
+0

哪個RDBMS?哪個版本? – 2012-01-18 18:03:25

+0

你的意思是08:00:00.000至08:59:59.999?也就是說,包括09:00在內? – gbn 2012-01-18 18:04:36

+0

sql server 2005和yes 8-8:59:59 – Somebody 2012-01-18 18:06:26

回答

4

SQL Server 2005及更早版本

SELECT 
    COUNT(*), 
    DATEADD(dd, DATEDIFF(dd, 0, SomeDateTime), 0) 
    -- SQL Server 2008: CAST(SomeDateTime AS date) 
FROM 
    SomeTable 
WHERE 
    DATEPART(Hour, SomeDateTime) = 8 
GROUP BY 
    DATEADD(dd, DATEDIFF(dd, 0, SomeDateTime), 0); 
    -- SQL Server 2008: CAST(SomeDateTime AS date); 

的MySQL:

SELECT 
    COUNT(*), 
    DATE(SomeDateTime) 
FROM 
    SomeTable 
WHERE 
    HOUR(SomeDateTime) = 8 
GROUP BY 
    DATE(SomeDateTime); 
+0

如果您篩選只是爲了小時,它會計算所有的日子在特定時間 – Somebody 2012-01-18 18:10:59

+0

@Somebody:正確的,GROUP BY照顧或「每天」 – gbn 2012-01-18 18:13:42

+0

感謝,但我也需要,對於一系列日期,如何我可以這樣做嗎? – Somebody 2012-01-18 18:16:17

2

在這種情況下,最簡單的代碼,並以最快的代碼可能有很大的差異,可能取決於你的數據集的大小。

我懷疑最快會加入日曆和過濾器。在這種情況下,我會做一個日曆我開始前,但我建議一個永久的...

CREATE TABLE #calendar (
    date AS DATETIME 
) 
INSERT INTO #calendar SELECT '2011-12-31' UNION ALL SELECT '2012-01-01' 
      UNION ALL SELECT '2012-01-02' UNION ALL SELECT '2012-01-03' 
      UNION ALL SELECT '2012-01-04' UNION ALL SELECT '2012-01-05' 

SELECT 
    calendar.date, 
    COUNT(*) 
FROM 
    yourTable 
INNER JOIN 
    #calendar AS calendar 
    ON yourTable.DateTimeField >= calendar.date + @minTime 
    AND yourTable.DateTimeField < calendar.date + @maxTime 
WHERE 
     calendar.date >= @startDate 
    AND calendar.date <= @endDate 
GROUP BY 
    calendar.date 

這應該得到多數指數友好的查詢,因此對數據的任何合理的尺寸是非常有效的。

注:

的部分會有所不同。你剛纔說的MS SQL Server,所以它會更喜歡......

ON yourTable.DateTimeField >= DATEADD(hour, @minHour, calendar.date) 
    AND yourTable.DateTimeField < DATEADD(hour, @maxHour, calendar.date) 
+0

這樣可以避免使用DATEPART()和其他函數來產生索引友好查詢。這意味着只處理索引的相關部分,而不是掃描整個索引或表。 – MatBailie 2012-01-18 18:20:23

0

SQL Server 2005中

IF OBJECT_ID('tempdb.dbo.#DATES') IS NOT NULL 
    DROP TABLE #DATES 

CREATE TABLE #DATES 
    ( LogDate smalldatetime ) 

INSERT INTO #DATES 
    ( LogDate) 
      SELECT '2012-01-01 08:26' 
UNION SELECT '2012-01-01 08:40' 
UNION SELECT '2012-01-01 09:26' 
UNION SELECT '2012-01-01 10:26' 
UNION SELECT '2012-01-02 08:06' 
UNION SELECT '2012-01-02 09:26' 
UNION SELECT '2012-01-02 09:40' 
UNION SELECT '2012-01-03 08:30' 
UNION SELECT '2012-01-03 10:26' 
UNION SELECT '2012-01-03 15:26' 

DECLARE @nStartHour smallint 
DECLARE @nEndHour smallint 

SET @nStartHour = 15 
SET @nEndHour = 16 

SELECT CONVERT(varchar, LogDate, 101), COUNT(*) 
FROM  #DATES 
WHERE  DATEPART(hour,LogDate) BETWEEN @nStartHour AND (@nEndHour - 1) 
GROUP BY CONVERT(varchar, LogDate, 101)