SQL动态日期但固定时间查询

SQL动态日期但固定时间查询,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我正在尝试编写一个类似下面示例的sql查询,但是,我需要它始终选择DateEntered字段,该字段位于当天上午8:00的日期和当天下午4:00的日期之间。我不知道该怎么办。有人能帮忙吗 SELECT OrderNumber , OrderRelease , HeatNumber , HeatSuffix , Operation , COUNT(Operation) AS [Pieces Out of Tolerance] FROM

我正在尝试编写一个类似下面示例的sql查询,但是,我需要它始终选择DateEntered字段,该字段位于当天上午8:00的日期和当天下午4:00的日期之间。我不知道该怎么办。有人能帮忙吗

SELECT     OrderNumber
    , OrderRelease
    , HeatNumber
    , HeatSuffix
    , Operation
    , COUNT(Operation) AS [Pieces Out of Tolerance]
FROM         Alerts
WHERE     (Mill = 3) 
    AND (DateEntered BETWEEN GetDate '08:00' AND GetDate '16:00')
GROUP BY OrderNumber, OrderRelease, HeatNumber, HeatSuffix, Operation

,120
指定ODBC日期时间格式,该格式无论语言环境如何都是常量。

由于您使用的是SQL Server 2008,因此可以强制转换为日期或时间。要获取08:00的当前日期,您将使用:

(CAST(CAST(getdate() AS DATE) AS DATETIME) + CAST('08:00' AS TIME)) 
要在16:00获取当前日期,请执行以下操作:

(CAST(CAST(getdate() AS DATE) AS DATETIME) + CAST('16:00' AS TIME)))
将其放入您的查询中:

SELECT OrderNumber
    , OrderRelease
    , HeatNumber
    , HeatSuffix
    , Operation
    , COUNT(Operation) AS [Pieces Out of Tolerance]
FROM         Alerts
WHERE     (Mill = 3) 
    AND (DateEntered 
        BETWEEN (CAST(CAST(getdate() AS DATE) AS DATETIME) + CAST('08:00' AS TIME)) 
        AND (CAST(CAST(getdate() AS DATE) AS DATETIME) + CAST('16:00' AS TIME)))
GROUP BY OrderNumber, OrderRelease, HeatNumber, HeatSuffix, Operation

这可能对你有用

 DateEntered BETWEEN dateadd(hour, 8, cast(cast(getdate() as date) as datetime)) AND 
                     dateadd(hour, 16, cast(cast(getdate() as date) as datetime))
但这将(正如您的查询所做的那样)包括时间为
16:00:00.000'
的行,但不包括时间为
16:00:00.003'
的行

如果要在17:00之前包含所有行,请使用此选项

 DateEntered >= dateadd(hour, 8, cast(cast(getdate() as date) as datetime)) AND
 DateEntered <  dateadd(hour, 17, cast(cast(getdate() as date) as datetime))
DateEntered>=dateadd(小时,8,强制转换(强制转换(getdate()为日期)为datetime))和
DateEntered
这将起作用,但在
DateEntered
列上不可搜索。通常,您应该寻找一种解决方案,将
DateEntered
与两个常量值进行比较。@ChristianHayter您的观点是正确的,所以我尝试了您的解决方案,它也很有效。谢谢大家的帮助。
SELECT     OrderNumber
    , OrderRelease
    , HeatNumber
    , HeatSuffix
    , Operation
    , COUNT(Operation) AS [Pieces Out of Tolerance]
FROM         Alerts
WHERE     (Mill = 3) 
    AND (datediff(dd,DateEntered,getdate()) = 0 AND Datepart(hh,DateEntered) BETWEEN '08' AND '16')
GROUP BY OrderNumber, OrderRelease, HeatNumber, HeatSuffix, Operation
 DateEntered BETWEEN dateadd(hour, 8, cast(cast(getdate() as date) as datetime)) AND 
                     dateadd(hour, 16, cast(cast(getdate() as date) as datetime))
 DateEntered >= dateadd(hour, 8, cast(cast(getdate() as date) as datetime)) AND
 DateEntered <  dateadd(hour, 17, cast(cast(getdate() as date) as datetime))