2014-01-09 43 views
0

這是我的查詢 - 它會檢索昨天的數據 - 每天 - 但我需要添加一個時間窗口。 我是一個SQL新手,幾乎什麼都不知道,所以任何和所有的幫助非常感謝。時間戳「昨天」,但具有特定的小時範圍

SELECT QB.vw_Device.DeviceName + '-' + QB.vw_Item.ItemId AS [Station-ItemID], 
             QB.vw_PocketAccess.TransactionQuantity AS Qty, 
             QB.vw_PocketAccess.PocketAccessDateTime AS [Time Stamp] 
FROM QB.vw_PocketAccess 
INNER JOIN QB.vw_TransactionType ON QB.vw_PocketAccess.TransactionTypeKey = QB.vw_TransactionType.TransactionTypeKey 
INNER JOIN QB.vw_User ON QB.vw_PocketAccess.UserKey = QB.vw_User.UserKey 
AND QB.vw_PocketAccess.DataStoreKey = QB.vw_User.DataStoreKey 
INNER JOIN QB.vw_Item ON QB.vw_PocketAccess.ItemKey = QB.vw_Item.ItemKey 
AND QB.vw_PocketAccess.DataStoreKey = QB.vw_Item.DataStoreKey 
INNER JOIN QB.vw_Device ON QB.vw_Item.DataStoreKey = QB.vw_Device.DataStoreKey 
AND QB.vw_PocketAccess.DeviceKey = QB.vw_Device.DeviceKey 
INNER JOIN QB.vw_ItemClass ON QB.vw_PocketAccess.DataStoreKey = QB.vw_ItemClass.DataStoreKey 
AND QB.vw_Item.ItemClass = QB.vw_ItemClass.ItemClass 
AND QB.vw_Item.ClientKey = QB.vw_ItemClass.ClientKey 
WHERE QB.vw_PocketAccess.PocketAccessDateKey = Cast(Convert(VARCHAR(8),DateAdd(DD, -1, SYSDATETIME()),112) AS INT) 

我在尋找午夜9:00,和現場PocketAccessDateTime之間的窗口是datetime格式。

我知道我使用PocketAccessDateKey作爲我的'昨天'過濾器,我只是不知道如何使這項工作。

誠摯的感謝, 拉里

+2

尊敬的領主,那是什麼怪物?沒有冒犯,但.. O_o – lucke84

+0

沒有采取 - 它需要幾張桌子得到我需要的輸出......我沒有創造它,我只是使用它。 – zymurgist

+1

但是你至少可以將它帶入可讀的形式。這就是他的意思。或者更好的是,我們不需要回答這個問題。 – fancyPants

回答

0

你可以用一些時髦DATEADD/DATEDIFF詭計做到這一點:

Where 
    QB.vw_PocketAccess.PocketAccessDateTime >= 
      DATEADD(day,DATEDIFF(day,'20010102',SYSDATETIME()), 
            '2001-01-01T00:00:00') AND 
    QB.vw_PocketAccess.PocketAccessDateTime < 
      DATEADD(day,DATEDIFF(day,'20010102',SYSDATETIME()), 
            '2001-01-01T09:00:00') 

會發現行,其中PocketAccessDateKey大於(或等於)到午夜昨天也低於昨天上午9點。

訣竅在於選擇適當的常量日期時間值來表示我們希望找到的關係。在這裏,我隨意使用一些特定的日期從2001年1月


當使用連續的數據,如日期時間價值的工作,通常要半開區間,如在這兒,我的工作m使用包括開始日期時間和獨家結束日期時間。它避免了許多重複計算問題和/或必須計算相當複雜的端點值。

+0

DateKey沒有時間戳,只有日期 - 顯然是必需的。當我保存查詢時,我得到一個「日期過濾器應該包含有效的DateKey值」錯誤。所以,我想我需要DateKey來獲取日期過濾器,並且可能包含PocketAccessDateTime以獲取時間值?或者我每天手動編輯劇本「昨天」?謝謝一束! – zymurgist

+0

我顯示的日期時間值不應該需要編輯。如果您可以顯示這些列的一些示例數據,以便我們可以看到您想要處理的內容,它會提供幫助。 –

+0

日期時間數學的榮譽,而不是轉換爲字符串... –

0

隨着PocketAccessDateKey是可以將此轉化爲含有日期和時間,它包含字符串昨天加上所需的時間比較字符串中的日期時間:

WHERE 
    Replace(Convert(VARCHAR(19), QB.vw_PocketAccess.PocketAccessDateKey, 120), '-', '') -- yyyy-mm-dd hh:mi:ss to yyyymmdd hh:mi:ss 
    BETWEEN 
    Convert(VARCHAR(19), DateAdd(DD, -1, SYSDATETIME()), 112) || ' 00:00:00' 
    AND 
    Convert(VARCHAR(19), DateAdd(DD, -1, SYSDATETIME()), 112) || ' 09:00:00' 
+0

'varchar(8)'將永遠不會*包含形式爲'yyyy-mm-dd hh:mm:ss(24h)'的東西作爲您的評論表示。它會包含一些形式'yyyy-mm-' –

+0

是的,那是無稽之談。我已經相應地更正了我的答案。謝謝。 –

+0

它仍然是錯誤的。 120寫'yyyy-mm-dd',而112寫'yyyymmdd'。我已經更正了我的答案。 –

相關問題