我对我目前正在撰写的报告有疑问。
我需要此查询仅向我显示具有 < -5 as mins_elapse 的订单项
这是代码。我省略了FROM
防止商业身份形式的条款。
select
H.ORDER_NUM
,H.CUST_NUM
,H.CREATION_DATE
,H.DUE_DATE
,H.ORDER_PRIORITY
,H.ORDER_STATUS
,H.ORDER_TYPE
,H.TRAILER_ROUTE
,S.SHIP_ADDRESS_1
,S.SHIP_CITY
,S.SHIP_STATE
,S.SHIP_COUNTRY
,S.SHIP_POSTAL_CODE
,C.SERVICE_CODE
,C.CODE_TEXT
,SUBSTRING(pm.ship_time, 1, 2) + ':' + SUBSTRING(pm.ship_time, 3, 2) + ':' + RIGHT(pm.ship_time, 2) as manifest_time
,CONVERT(varchar(8), CURRENT_TIMESTAMP, 114) as curr_time
,--determine the difference between when the order was manifested and the current time and use it in the WHERE clause below
DATEDIFF(MINUTE, SUBSTRING(pm.ship_time, 1, 2) + ':' + SUBSTRING(pm.ship_time, 3, 2) + ':' + RIGHT(pm.ship_time, 2), convert(varchar(8), current_timestamp, 114)) as mins_elapsed
where
cust_num = @customer `
and @service = s.service_code
and @add1 = S.SHIP_ADDRESS_1
and @zip = S.SHIP_POSTAL_CODE
and H.ORDER_STATUS between 20
and 90
and DATEDIFF(MINUTE, SUBSTRING(pm.ship_time, 1, 2) + ':' + SUBSTRING(pm.ship_time, 3, 2) + ':' + RIGHT(pm.ship_time, 2), convert(varchar(8), current_timestamp, 114)) <= 5
and h.large_order = 'Y' `
and creation_date > 20120701 `
group by
H.ORDER_NUM
,H.CUST_NUM
,H.CREATION_DATE
,H.DUE_DATE
,H.ORDER_PRIORITY
,H.ORDER_STATUS
,H.ORDER_TYPE
,H.TRAILER_ROUTE
,PM.SHIP_TIME
,S.SHIP_ADDRESS_1
,S.SHIP_CITY
,S.SHIP_STATE
,S.SHIP_COUNTRY
,S.SHIP_POSTAL_CODE
,C.SERVICE_CODE
,C.CODE_TEXT
,H.LARGE_ORDER
,H.ASSOC_DATE
,H.ASSOC_TIME`
having
DATEDIFF(MINUTE, SUBSTRING(pm.ship_time, 1, 2) + ':' + SUBSTRING(pm.ship_time, 3, 2) + ':' + RIGHT(pm.ship_time, 2), convert(varchar(8), current_timestamp, 114)) <= 5
order by
H.LARGE_ORDER desc
,H.ORDER_STATUS asc
,H.ASSOC_DATE asc
,H.ASSOC_TIME asc
如果您正在为“Group By”查询而苦苦挣扎,那么@Kenneth Fisher 的回答可能会有所帮助,或者您需要提供与@dnoeth 所询问的相同的更多详细信息
我想指出图像表中的所有值都已经小于 -5 或 5。因为值为负,所以 -42、-71、-100 小于 -5 或 5。(在你的问题中你说 -5但在查询中你有 5)
二、关于DateDiff返回结果。语法 = DATEDIFF ( datepart , startdate , enddate ) 所以如果 enddate 是今天并且如果 DateDiff 结果为正,则表示过去的持续时间,如果 DateDiff 结果为负,则表示未来的持续时间。
如果您对过去 5 分钟内发货的订单感兴趣,您应该寻找
(我是根据您的列名猜测的,mins_elapsed 表示您对过去的持续时间感兴趣。)
第三,在 DateDiff 中你只考虑时间值,检查下面的查询,
倒数第二个查询返回 0,而最后一个查询返回 > 1000。
如果您将发货日期存储在数据库中,那么在将 DateDiff 与当前日期一起使用之前,您应该将其限制为今天的日期。
现在,您可能正在将今天下午 4 点与昨天或前天的下午 5 点进行比较,结果是 -60 分钟。
好的,根据@dnoeth 的评论稍微更改一下我的答案。
首先,如果您正在进行聚合,则只需要 a
GROUP BY
和 a 。HAVING
所以,如果你希望总差小于 5,你可以这样做:平均差异等相同。但不要将其放在
WHERE
子句中。另一方面,如果你只需要每一行 < 5 分钟,那么你只需将它放在子句中并完全
WHERE
摆脱。HAVING
在这一点上,你需要决定你是否想要一个
GROUP BY
。除非你有一些聚合,否则你可能根本不需要它。您可以使用它来删除重复项,但此时您可以轻松地使用DISTINCT
.