这是我的查询 - 它会检索昨天的数据 - 每天 - 但我需要添加一个时间窗口。 我是一个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字段是日期时间格式。
我知道我使用PocketAccessDateKey作为我的'昨天'过滤器,我只是不知道如何使这项工作。
真诚的感谢, 拉里
答案 0 :(得分: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
大于(或等于) 1 的行到午夜,也不到昨天的上午9:00。
诀窍是选择适当的常量日期时间值来表达我们想要找到的关系。在这里,我随意使用2001年1月的某些特定日期。
1 使用日期时间值等连续数据时,您通常希望使用半开放时间间隔,例如我在这里使用包含开始日期时间和独占结束日期时间。它避免了许多重复计算问题和/或必须计算相当复杂的端点值。
答案 1 :(得分: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'