Ir para conteúdo
Fórum Script Brasil

rderoci

Membros
  • Total de itens

    11
  • Registro em

  • Última visita

Posts postados por rderoci

  1. Olá pessoas!

    Venho para tirar uma dúvida... O MySql Cluster, ajuda a melhorar o tempo de resposta quando temos bases bem grandes? Digo pois tenho em java um algoritimo do Framework Apache Mahout que demora horas para ser executado por motivo de queries massivas no MySql!

    O MySql Cluster faz acesso aos nós do cluster em paralelo (para aumentar a velocidade)?

    Ou ele seria mais para quando um banco por algum motivo cair, o outro suprir? Ou seja, não tem nada haver com a velocidade da consulta...

    Vocês saberiam algum outro método, pode ser para qualquer SGBD, A NÍVEL DE BANCO DE DADOS que faça minha consulta a esses meus vários gigabytes de dados ficarem bem mais rápidos?!

  2. Boa tarde Rderoci,

    você pode fazer o agrupamento por Matrícula, pegando o max(DATA). Ai você conseguirá agrupar, pegando um único registro por matricula (sendo ele o mais recente).

    Mas tem uma obs.: para realizar o agrupamento, os campos VALOR1 e VALOR2 devem ficar de fora, porque senão não ocorrerá o agrupamento corretamente. Ficaria mais ou menos assim:

    select matricula, MAX(data) FROM TABELA GROUP BY matricula

    Fulvio,

    Exatamente aí é que está: tenho que retornar o VALOR1 e VALOR2... Será que um simples select eu não conseguirei? Terei que fazer alguma procedure?

  3. Caros,

    Mais uma vez cá estou solicitando ajuda de vocês!

    Tenho o seguinte "problema":

    Tenho que selecionar a primeira linha de cada agrupamento.

    Exemplo:

    MATRICULA|VALOR1|VALOR2|DATA

    111............|0..........|1.........|01/01/2010

    111............|1..........|2.........|02/01/2010

    111............|0..........|1.........|03/01/2010

    333............|4..........|5.........|03/01/2010

    333............|5..........|2.........|07/01/2010

    777............|1..........|2.........|04/02/2010

    777............|0..........|1.........|09/01/2010

    888............|1..........|2.........|05/01/2010

    No caso, teria que fazer um select que me retornasse somente 1 registro de cada agrupamento (por matricula), e esse 1 registro seria o que tiver a DATA mais atual, ou seja, teria que me retornar:

    MATRICULA|VALOR1|VALOR2|DATA

    111............|0..........|1.........|03/01/2010

    333............|5..........|2.........|07/01/2010

    777............|1..........|2.........|04/02/2010

    888............|1..........|2.........|05/01/2010

    Valeu!!! :wacko:

  4. Então inverte os dias, meses e anos (igual o post que postei lá em cima). O formato da data no Banco é fundamental!!

    No meu Banco está YYYY-MM-DD.

    Olhe o formato do seu e inverta o script para que as datas fiquem corretas.

    Minha configuração:

    Set Option Value

    language us_english

    dateformat mdy

    datefirst 7

    Já tentei com MDY e nada... Já tentei de outras ordens e nada, também.

  5. Rs... postei um exemplo completo pra vc. Criei uma tabela temporária nos moldes de sua base.

    Dê uma olhada se é isto mesmo. Segue script comentado:

    -- Criação de temporária
    create table #ITEM_CARNE (Mes SMALLINT, Ano SMALLINT)
    
    -- Inserção de dados
    insert into #ITEM_CARNE values (08, 2009)
    insert into #ITEM_CARNE values (09, 2009)
    insert into #ITEM_CARNE values (10, 2009)
    insert into #ITEM_CARNE values (1, 2010)
    insert into #ITEM_CARNE values (3, 2010)
    insert into #ITEM_CARNE values (5, 2010)
    insert into #ITEM_CARNE values (6, 2010)
    
    -- Conferência
    select * from #ITEM_CARNE
    
    -- Seleciona daqui até o final e roda
    Declare @AnoInicio SMALLINT
    Declare @MesInicio SMALLINT
    Declare @AnoFim SMALLINT
    Declare @MesFim SMALLINT
    
    select * from #ITEM_CARNE
    
    -- Pra alternar a data de pesquisa, altera os valores das variáveis
    Set @AnoInicio = 2009
    Set @MesInicio = 10
    Set @AnoFim = 2010
    Set @MesFim = 05
    
    select cast((convert(varchar,ANO) + '/' + convert(varchar,MES) + '/01') as datetime), * from #ITEM_CARNE
    
    where cast((convert(varchar,ANO) + '/' + convert(varchar,MES) + '/01') as datetime) BETWEEN
    cast((cast(@AnoInicio as varchar) + '/'+ cast(@MesInicio as varchar) + '/01') as datetime) and
    cast((cast(@AnoFim as varchar) + '/'+ cast(@MesFim as varchar) + '/01') as datetime)

    Aí dá: A conversão de um tipo de dados char em um tipo de dados datetime resultou em um valor datetime fora do intervalo.

    No momento do between

    rs... Vou tentando aqui...

  6. Dê uma olhada então nos dados que está tentando converter. Faz um select pra ver se existe algum mês fora do intervalo de 1 a 12. Mesmo esquema com os anos (creio que este ai não será o problema). Fiz um exemplo gerando o erro que postou:

    select cast ('2010-15-15' as datetime)

    Caros amiguinhos... Ainda não consegui!

    Alguém tem uma luz?

    Resumindo:

    Tenho na tabela X, dois campos: 'ANO'(SMALLINT) e 'MES'(SMALLINT)

    devo buscar datas entre eles, onde no sistema eu colocaria:

    Ano início: 2009

    Mes início: 10

    Ano fim: 2010

    Mes fim: 05

    Como tenho o mes e o ano separado cada um em um campo, tá difícil mostrar o between dos dois sem usar o 'IN'.

  7. Dé uma olhada no formato da data. Este erro é porque está tentando converter pra uma data que não existe. Se você trocar o mês pelo dia, dá erro de conversão, entendeu?

    Ex.: você está falando que é o dia 20, mas na conversão o sql está entendendo que o mês é 20. Como não existe, aparece o erro de conversão.

    Se o formato for em inglês, faça AAAAMMDD. Provavelmente deve ser este... apenas troque a ordem do dia pelo mês.

    Já tentei com todas as formas possíveis... mas tudo resultou nesse mesmo erro...

    executando os options: dbcc useroptions

    Tenho:

    Set Option Value

    language us_english

    dateformat mdy

    (já usei mdy, etc...).

  8. Boa tarde Amigo,

    Entedi o problema. A única dúvida é a entrada dos dados de pesquisa...

    Quando você diz q a data de pesquisa está entre 12/2009 e 01/2010, a data está neste formato?

    O problema de utilizar comparações de datas com campos numéricos, é á diferença no modo de comparação:

    - Para você saber se uma data é menor que a outra, é necessário ter o ano.

    - Para saber se um número é menor que o outro, apenas uma comparação simples basta.

    É um pouco "lógico" eu falar isto, mas quando se programa, as coisas não ficam tão lógicas.... rs.

    Vi que faz o convert pra concatenar os campos das datas. O que me parece que está faltando é a conversão da data concatenada para o tipo DATA. Ai, você poderá fazer uma comparação entre datas. Desta forma, você está comparando string com string.

    Ficaria mais ou menos assim:

    select cast((convert(varchar,ano) + '/01/' + convert(varchar,mes)) as datetime) from ALUNO 
    where cast((convert(varchar,ano) + '/01/' + convert(varchar,mes)) as datetime) BETWEEN
    cast(('2009' + '/01/'+ convert(varchar,mes)) as datetime) and 
    cast(('2010' + '/01/'+ convert(varchar,mes)) as datetime)
    CONSIDERAÇÕES: - Perceba que não converti o ano de pesquisa 2009 e nem 2010. Basta colocar aspas simples para identifica pro sql que é caracteres. Se não colocar, a função + tentará somar, e não concatenar. - Atenção ao formato da data. Vi que no seu exemplo colocou AAAADDMM. Verifique se o formato está ok. - Colocou também o acrescimo de 0 no mês. Na conversão, o sql "entede" o formato e já ajusta o campo. Espero que ajude a resolver o problema... Qualquer dúvida, posta ai!!! :.)
    Fiz aqui:
    select cast((convert(varchar,I.ANO) + '/01/' + convert(varchar,I.MES)) as datetime)
    from ITEM_CARNE I
    where cast((convert(varchar,I.ANO) + '/01/' + convert(varchar,I.MES)) as datetime) BETWEEN
    cast(('2009' + '/01/'+ convert(varchar,I.MES)) as datetime) and
    cast(('2010' + '/01/'+ convert(varchar,I.MES)) as datetime)

    e me apareceu o seguinte erro:

    1)

    The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

    e 2)

    Quando dou um select, por exemplo, entre os meses 1 e 8, ele me retorna, também, os meses 10, 11 e 12, pois está buscando como se fosse um like do mês 1, entendeu?

    Vou continuar tentando aqui mas estou aberto a sugestões.... ;p

  9. Ou também pode usar o mais "incorreto", seria o periodo <= 'data' AND periodo => 'data'

    +- isso!!

    Mas use between.

    Aproveitando, conheça a função datediff(X, Campo1, Campo2)

    **O X pode ser day, month, year. Ela te mostra a diferença entre 2 campos data, seja em anos, meses ou dias(o que você escolher).

    Acho que você não entendeu...

    Vou dar um exemplo:

    tabela:

    ALUNO

    campos:

    'ANO' (SMALLINT), 'MES'(SMALLINT) e 'MATRICULA'

    como faço um between para me retornar somente as matriculas entre 12/2009 e 01/2010 (mês/ano)

    estou tentando da seguinte forma:

    SELECT top 100 CONVERT(VARCHAR(10),CONVERT(VARCHAR(4),i.ano)+'/01'+'/0'+CONVERT(VARCHAR(2),i.mes))

    from ALUNO i

    WHERE CONVERT(VARCHAR(10),CONVERT(VARCHAR(4),i.ano)+'/01'+'/0'+CONVERT(VARCHAR(2),i.mes)) BETWEEN

    CONVERT(VARCHAR(10),CONVERT(VARCHAR(4),2009)+'/01'+'/0'+CONVERT(VARCHAR(2),12))

    AND

    CONVERT(VARCHAR(10),CONVERT(VARCHAR(4),2010)+'/01'+'/0'+CONVERT(VARCHAR(2),01))

    Não dá certo.

×
×
  • Criar Novo...