Tenho uma pergunta sobre um relatório que estou escrevendo no momento.
Eu preciso que esta consulta mostre apenas itens de linha que tenham <-5 como mins_elapse
Aqui está o código. Deixei de fora a FROM
cláusula para evitar formas de identidade comercial.
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
Se você está lutando com consultas "Agrupar por", a resposta de @Kenneth Fisher pode ajudar ou você precisa fornecer mais detalhes, conforme solicitado por @dnoeth
Eu queria apontar que todos os valores na tabela de imagem já são menores que -5 ou 5. Como os valores são negativos , -42,-71,-100 são menores que -5 ou 5. (Na sua pergunta, você disse -5 mas na consulta você tem 5)
Em segundo lugar, sobre DateDiff retornou o resultado. Sintaxe = DATEDIFF ( datepart , startdate , enddate ) portanto, se enddate for hoje e se o resultado DateDiff for positivo, indica a duração passada, se o resultado DateDiff for negativo, indica a duração futura.
Se você estiver interessado em um pedido enviado nos últimos 5 minutos, você deve procurar
(Suponho que isso seja baseado no nome da sua coluna, mins_elapsed indica que você está interessado na duração passada.)
Terceiro, em DateDiff você está considerando apenas valores de tempo, examine as consultas abaixo,
a penúltima consulta retorna 0 enquanto a última consulta retorna > 1000.
Se você armazenar a data de envio em seu banco de dados, deverá restringi-la à data de hoje antes de usar DateDiff com a data atual.
Neste momento, você provavelmente está comparando as 16h de hoje com as 17h de ontem ou anteontem e obtém o resultado -60 minutos.
Ok, mudando um pouco minha resposta com base no comentário de @dnoeth.
Em primeiro lugar, você só precisa de a
GROUP BY
e aHAVING
se estiver fazendo uma agregação. Portanto, se você deseja que a diferença total seja < 5, faça algo assim:O mesmo para diferença média etc. Mas não coloque isso na
WHERE
cláusula.Se, por outro lado, você precisar apenas de < 5 minutos para cada linha individual, basta colocá-lo na
WHERE
cláusula e se livrarHAVING
totalmente do.Neste ponto, você precisa decidir se deseja um
GROUP BY
. A menos que você tenha alguns agregados, talvez não precise deles. Você pode usá-lo para se livrar de duplicatas, mas nesse ponto você pode facilmente usarDISTINCT
.