extrair data de um campo datetime
Olá!
Gostaria de saber se tem como extrair uma data de um campo datetime, por exemplo, uma das condições na cláusula where é tabcaixa.datahoraf between ´2004-10-01´ and ´2004-10-20´, onde o campo tabcaixa.datahoraf é por exemplo 19/10/2004 15:02:25.
Pois preciso somar o vlr de um determinado campo quando a data estiver nesse intervalo, porém preciso somente da data...
Obrigada
Livia
Gostaria de saber se tem como extrair uma data de um campo datetime, por exemplo, uma das condições na cláusula where é tabcaixa.datahoraf between ´2004-10-01´ and ´2004-10-20´, onde o campo tabcaixa.datahoraf é por exemplo 19/10/2004 15:02:25.
Pois preciso somar o vlr de um determinado campo quando a data estiver nesse intervalo, porém preciso somente da data...
Obrigada
Livia
Livia
Curtidas 1
Respostas
Gandalf.nho
22/10/2004
Use um CAST(campo_data AS DATE)
GOSTEI 0
Livia
22/10/2004
Obrigada gandalf.nho..era isso mesmo!
Só que esqueci de um detalhe...Como estou usando uma função agregada, preciso dar um group by. E aparece duas repetidas pois seleciono o campo datahoraf p/ mostrar a data e os valores daquela data, coloquei o cast no select e a data aparece do jeito q queria, mas como uso o group by ele aparece duas vezes. Como faço p/ agrupar considerando apenas a data?
Livia
Só que esqueci de um detalhe...Como estou usando uma função agregada, preciso dar um group by. E aparece duas repetidas pois seleciono o campo datahoraf p/ mostrar a data e os valores daquela data, coloquei o cast no select e a data aparece do jeito q queria, mas como uso o group by ele aparece duas vezes. Como faço p/ agrupar considerando apenas a data?
Livia
GOSTEI 0
Gandalf.nho
22/10/2004
Coloque sua consulta aí
GOSTEI 0
Livia
22/10/2004
SELECT cast(Tabcaixa.DATAHORAF as date), sum(Tabkardp.ULT_CUSTO_COR*quant) as custo ,
(select sum(prevenda.VLRTOTAL)
from tab_prevenda prevenda,tabcaixa c,tabmovcaixa m
where
(prevenda.COD_EMP = c.COD_EMP)
AND (c.DATAHORAA = m.DATAHORAA)
AND (c.DATAHORAF IS NOT NULL)
AND (m.ORIGEM = ´PVC´)
AND (prevenda.SITUAC = ´4´)
AND (prevenda.COD_INT = Tab_prevenda.cod_int) and prevenda.cod_int=m.numdoc
)as total
FROM TABCAIXA Tabcaixa, TABMOVCAIXA Tabmovcaixa, TAB_PREVENDA Tab_prevenda, TABKARDP Tabkardp
WHERE (Tab_prevenda.COD_EMP = Tabcaixa.COD_EMP)
AND (Tabcaixa.COD_EMP = Tabmovcaixa.COD_EMP)
AND (Tab_prevenda.COD_EMP = Tabkardp.COD_EMP) and cast(tabcaixa.datahoraf as date)between ´2004-10-01´ and ´2004-10-19´
AND (Tabcaixa.DATAHORAA = Tabmovcaixa.DATAHORAA)
AND (Tabcaixa.DATAHORAF IS NOT NULL)
AND (Tabmovcaixa.ORIGEM = ´PVC´)
AND (Tab_prevenda.SITUAC = ´4´)
AND (Tab_prevenda.COD_INT = Tabmovcaixa.NUMDOC)
AND (Tabkardp.HISTORICO = 15)
AND (Tabkardp.NUMDOC = Tab_prevenda.cod_int )
group by tabcaixa.datahoraf
(select sum(prevenda.VLRTOTAL)
from tab_prevenda prevenda,tabcaixa c,tabmovcaixa m
where
(prevenda.COD_EMP = c.COD_EMP)
AND (c.DATAHORAA = m.DATAHORAA)
AND (c.DATAHORAF IS NOT NULL)
AND (m.ORIGEM = ´PVC´)
AND (prevenda.SITUAC = ´4´)
AND (prevenda.COD_INT = Tab_prevenda.cod_int) and prevenda.cod_int=m.numdoc
)as total
FROM TABCAIXA Tabcaixa, TABMOVCAIXA Tabmovcaixa, TAB_PREVENDA Tab_prevenda, TABKARDP Tabkardp
WHERE (Tab_prevenda.COD_EMP = Tabcaixa.COD_EMP)
AND (Tabcaixa.COD_EMP = Tabmovcaixa.COD_EMP)
AND (Tab_prevenda.COD_EMP = Tabkardp.COD_EMP) and cast(tabcaixa.datahoraf as date)between ´2004-10-01´ and ´2004-10-19´
AND (Tabcaixa.DATAHORAA = Tabmovcaixa.DATAHORAA)
AND (Tabcaixa.DATAHORAF IS NOT NULL)
AND (Tabmovcaixa.ORIGEM = ´PVC´)
AND (Tab_prevenda.SITUAC = ´4´)
AND (Tab_prevenda.COD_INT = Tabmovcaixa.NUMDOC)
AND (Tabkardp.HISTORICO = 15)
AND (Tabkardp.NUMDOC = Tab_prevenda.cod_int )
group by tabcaixa.datahoraf
GOSTEI 0
Gandalf.nho
22/10/2004
É que você está agrupando pelo campo data, mas mostrando o campo via CAST. Se você usa Firebird, pode dar um GROUP BY no campo sendo tratado pelo CAST.
GOSTEI 0
Livia
22/10/2004
Seria
group by cast(tabcaixa.datahoraf as date)???
group by cast(tabcaixa.datahoraf as date)???
GOSTEI 0
Gandalf.nho
22/10/2004
Use a posição do campo na lista. No seu caso, GROUP BY 1
GOSTEI 0
Livia
22/10/2004
Eu tentei fazer isso mas dá erro token unknown
GOSTEI 0
Gandalf.nho
22/10/2004
Qual seu banco de dados e a versão?
GOSTEI 0
Livia
22/10/2004
Interbase 6
GOSTEI 0
Gandalf.nho
22/10/2004
Aí está o problema, o Interbase não aceita GROUP BY em função. Uma sugestão seria migrar para o Firebird que permite isso, outra seria tentar montar uma view fazendo o CAST no campo e depois montar a SQL em cima dessa view, ao invés da tabela.
GOSTEI 0
Pedro Lima
22/10/2004
Use um CAST(campo_data AS DATE)
Muito Obrigado amigo, sua resposta foi simples e objetiva, pesquisei durante 3h sem sucesso, li sua resposta e consegui resolver um problema no meu programa. Só um adendo, no meu caso, meu programa executava a query e no CAST existia um espaço entre a palavra CAST e o parênteses, dessa forma CAST (campo_datetime AS DATE), quebrei a cabeça quando apaguei o espaço dessa forma: CAST(campo_dateime AS DATE) consegui executa a pesquisa. Sei que é um erro bem bobo, porém pode ajudar quem esteja na mesma situação. Mais uma vez obrigado pela ajuda. Abraços.
GOSTEI 0
Vicente Santos
22/10/2004
Use um CAST(campo_data AS DATE)
show !
GOSTEI 0