none
Ajuda com SELECT em campo DATETIME desconsiderando a DATA... RRS feed

  • Pergunta

  • Olá amigos do MSND!

    Preciso da ajuda de vcs para criar uma query que me retorne a quantidade de registros em intervalo de horas em um campo datetime DESCONSIDERANDO A DATA.

    EX: Preciso saber quantos registros tenho entre as 19:00:00 e 23:59:59 hs, INDEPENDENTE DA DATA.

    Me parece simples, mas nao estou conseguindo.

    segue meu select atual que esta trazendo todos os registros por causa da DATA:

    SELECT        COUNT(COLETA_ID) AS HORARIO_NOBRE
    FROM            ColetaCustoPrograma
    WHERE        (DATA_INICIO >= @DATA_INICIO) AND (DATA_FIM <= @DATA_FIM)

    Ficou claro? ou ta confuso?

    Para ajudar a interpretação segue meu "CENÁRIO":

    Tenho um sistema de monitoramento de comerciais de TV. Preciso criar um relatório informando a quantidade de VEICULAÇÕES dentro do horário nobre que seria entre as 19:00:00 ate as 23:00:00.

    segunda-feira, 2 de março de 2015 20:38

Respostas

  • Boa tarde,

    Se você estiver utilizando o SQL Server 2008 ou mais recente pode fazer um Cast para Time. Ex:

    where
        CAST(DATA_INICIO AS TIME) >= @HORA_INICIO AND
        CAST(DATA_FIM AS TIME) <= @HORA_FIM

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Mario CBA segunda-feira, 2 de março de 2015 21:10
    segunda-feira, 2 de março de 2015 20:52
  • Mario,

    Tenta utilizar o CONVERT para converter tua data em horas e utilizar no WHERE

    CONVERT(TIME,GETDATE())

    Vai te retornar apenas as horas:minutos:segundos aí ocê pode colocar o intervalo no BETWEEN do teu WHERE mais ou menos assim:

    SELECT
       COUNT(COLETA_ID) AS HORARIO_NOBRE
    FROM
       ColetaCustoPrograma
    WHERE
       (CONVERT(TIME,DATA_INICIO) >= CONVERT(TIME,@DATA_INICIO)) AND (CONVERT(TIME,DATA_FIM) <= CONVERT(TIME,@DATA_FIM))

    Espero que o ajude.


    [MCP | MCSA Microsoft SQL Server 2012 | MCTS Microsoft Dynamics CRM 2011]

    segunda-feira, 2 de março de 2015 20:52
  • Para isso vc tem que extrair a parte tempo do seu campo data,  

    isso é feito forçando (cast) o campo data a ser do tipo TIME

    tente assim:

    SELECT        COUNT(COLETA_ID) AS HORARIO_NOBRE
    FROM            ColetaCustoPrograma
    WHERE      cast(DATA_INICIO as time) >= @DATA_INICIO) AND (cast(DATA_FIM as time)  <= @DATA_FIM)

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    • Marcado como Resposta Mario CBA segunda-feira, 2 de março de 2015 21:10
    segunda-feira, 2 de março de 2015 20:54

Todas as Respostas

  • Mario,

    Tenta utilizar o CONVERT para converter tua data em horas e utilizar no WHERE

    CONVERT(TIME,GETDATE())

    Vai te retornar apenas as horas:minutos:segundos aí ocê pode colocar o intervalo no BETWEEN do teu WHERE mais ou menos assim:

    SELECT
       COUNT(COLETA_ID) AS HORARIO_NOBRE
    FROM
       ColetaCustoPrograma
    WHERE
       (CONVERT(TIME,DATA_INICIO) >= CONVERT(TIME,@DATA_INICIO)) AND (CONVERT(TIME,DATA_FIM) <= CONVERT(TIME,@DATA_FIM))

    Espero que o ajude.


    [MCP | MCSA Microsoft SQL Server 2012 | MCTS Microsoft Dynamics CRM 2011]

    segunda-feira, 2 de março de 2015 20:52
  • Boa tarde,

    Se você estiver utilizando o SQL Server 2008 ou mais recente pode fazer um Cast para Time. Ex:

    where
        CAST(DATA_INICIO AS TIME) >= @HORA_INICIO AND
        CAST(DATA_FIM AS TIME) <= @HORA_FIM

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Mario CBA segunda-feira, 2 de março de 2015 21:10
    segunda-feira, 2 de março de 2015 20:52
  • Para isso vc tem que extrair a parte tempo do seu campo data,  

    isso é feito forçando (cast) o campo data a ser do tipo TIME

    tente assim:

    SELECT        COUNT(COLETA_ID) AS HORARIO_NOBRE
    FROM            ColetaCustoPrograma
    WHERE      cast(DATA_INICIO as time) >= @DATA_INICIO) AND (cast(DATA_FIM as time)  <= @DATA_FIM)

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    • Marcado como Resposta Mario CBA segunda-feira, 2 de março de 2015 21:10
    segunda-feira, 2 de março de 2015 20:54
  • Funcionou perfeitamente! Me poupou muitas horas de pesquisa...

    Obrigado! 

    segunda-feira, 2 de março de 2015 21:12
  • Também funcionou assim, obrigado!
    segunda-feira, 2 de março de 2015 21:13
  • Obrigado! Agora entendi o processo todo.
    segunda-feira, 2 de março de 2015 21:13
  • Maria,

    Um detalhe é importante destacar quando utilizamos o Convert ou Cast na claúsula forçando a conversão de forma implícita o SQL Server será obrigado a mudar a sua forma de obtenção e apresentação dos dados, com isso, o plano de execução sofrerá impactos que em muitos casos poderá proporcionar em alguns casos um custo maior de processamento dos dados. 


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 4 de março de 2015 23:12