2012-09-04 245 views
1

我在下面的結構具有表Ms SQL Server 2005年(2008年)SQL查詢日期條件

ID Name  AddDate     AmendDate     Status 
----------------------------------------------------------------------- 
1 Jason 2012-09-03 08:01:00.000 2012-09-03 14:02:00.000 Amended 
2 Robert 2012-09-03 08:05:00.000 NULL      New 
3 Celia 2012-09-03 08:10:00.000 2012-09-03 14:02:00.000 Amended 
4 Jason 2012-09-03 14:02:00.000 NULL      New 
5 Robert 2012-09-03 14:03:00.000 2012-09-03 20:02:00.000 Amended 
6 Celia 2012-09-03 14:07:00.000 2012-09-03 20:02:00.000 Amended 
7 Jason 2012-09-03 20:00:00.000 NULL      New 
8 Robert 2012-09-03 20:02:00.000 NULL      New 
9 Celia 2012-09-03 20:04:00.000 NULL      New 

日常每天運行的快照三次,

請我怎麼能使用SQL查詢

  1. 從上午(或晚上)中選擇任意天數的所有記錄

  2. 我怎能取代(ISNULL(AmendDate, '2012.09.04'))對於哪裏是Null value,在當我走在歷史上,例如列AmendDate返回所有一行AddDate <= '2012-09-01' and AmendDate >= '2012-09-02'

  3. 問題是關於SELECT - FROM - WHERE -只有

+0

什麼叫「走在歷史上」是什麼意思?另外,您是否想將null AmendDate視爲2012.09.04? – Vikdor

+0

@Vikdor''走在歷史中''我的意思是從(例如)'一月','四月'或e.i. ...,並且在值爲NULL的情況下,我想添加NOW()或DATE()+ 1,或者更好使用'AmendDate> ='2012-01-15'或者修改日期NULL' – mKorbel

+0

對不起,我仍然無法得到它,你能夠添加查詢與選擇列表和where子句,然後告訴你打算如何獲得輸出? – Vikdor

回答

1

選擇所有記錄從早上/晚上的任何一天

select * 
from Table t 
where t.AddDate > '2012-09-03' 
     and t.AddDate < '2012-09-04' 
     and DatePart(HOUR, t.AddDate) < 12 -- Morning 
     -- and DatePart(HOUR, t.AddDate) > 18 -- Evening 

對於第二部分(鑑於requirem耳鼻喉科是不是很清楚)我認爲你可以使用Coalesce功能與CTE

;WITH FullData(Id, Name, AddDate, AmendDate, Status) 
    AS (SELECT t.Id, 
       t.Name, 
       t.AddDate, 
       COALESCE(t.AmendDate, '2012-09-04'), 
       Status 
     FROM Table t) 
SELECT * 
FROM FullData d 
WHERE d.AddDate <= '2012-09-01' 
     AND t.AmendDate >= '2012-09-02' 
+0

正確的方向 – mKorbel

1

對於第一個,您可以使用日期的DATEPART函數提取小時數,並根據您是否對早晨或晚上添加的記錄感興趣來應用標準。

DATEPART(hh, AddDate) BETWEEN 0 AND 12 -- Morning. 

第二個問題不太清楚:(

+0

謝謝你的回答+1 – mKorbel

1

你想要的東西,喜歡本作的2的問題,我使用的參數,因爲它是更容易顯示:

DECLARE @AddDate datetime 

    SELECT * 
    FROM yourTable 
    WHERE 
    AddDate <= @AddDate 
    and AmendDate >= ISNULL(AmendDate,DATEADD(day, 1, @AddDate)) 
+0

感謝回答+1 – mKorbel