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