2014-01-09 42 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'。我已经更正了我的答案。 –

相关问题