时间戳“昨天”但具有特定的小时范围

时间:2014-01-09 14:39:49

标签: sql-server

这是我的查询 - 它会检索昨天的数据 - 每天 - 但我需要添加一个时间窗口。 我是一个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作为我的'昨天'过滤器,我只是不知道如何使这项工作。

真诚的感谢, 拉里

2 个答案:

答案 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'