none
Adicionar hora e comparar datas RRS feed

  • Pergunta

  • Olá a todos, preciso fazer uma query que traga todos os registros até certo horário. Tentei fazer da maneira abaixo:

    IEnumerable<IConcurso> entitys = base.Db.VcsConcursos.Where(c => c.LoteriaId == loteriaId && c.Ativo == true && c.DataSorteio.Date.Add(c.VcsLoteria.HorarioEncerramento.Value.TimeOfDay) >= DateTime.Now).OfType<IConcurso>();
    

    mas retorna o erro:

    The datepart millisecond is not supported by date function dateadd for data type date.

     

    Alguém sabe alguma maneira que funcione? 

    Grato.

    sexta-feira, 27 de agosto de 2010 13:46

Respostas

Todas as Respostas

  • Olá.

    Eu tive problema no meu LINQ quando utilizava DateTime.Now no EntityFramework. Segundo pesquisa é porque quando o EF tenta converter o DateTime.Now para T-SQL não consegue, para resolver eu fiz o seguinte:

    DateTime? DataAtual = DateTime.Now
    
    Cliente cli = (from c in ef.Cliente
              where c.DataContratacao > DataAtual
              select c).FirstOrDefault();
    

    Espero que ajude.

    Sds.


    Marcos Aguiar Jr - Brazil blog: https://marquinhosnet.wordpress.com/
    sexta-feira, 27 de agosto de 2010 16:01
  • Continua com o mesmo erro =(, estou usando Linq to Sql 

     

    sexta-feira, 27 de agosto de 2010 17:23
  • Olá,
    Na sua tabela o campo DataSorteio é um DateTime ou SmallDateTime ?

    Att.
    Andeson

    sexta-feira, 27 de agosto de 2010 18:05
  • Datetime not null, e o horarioEncerramento também é datetime, mas é null.
    sexta-feira, 27 de agosto de 2010 18:30
  • sexta-feira, 27 de agosto de 2010 18:50
    Moderador
  • Do link só não tentei a converter ele pra IEnumerable manipular a data e depois converter pra IEqueryable, os outros exemplos não deram

    eu escrevi a query sem ser com lambda e funcionou, entretanto o sql gerado é considerável

    SELECT [t0].[BolaoId], [t0].[UserId], [t0].[ConcursoId], [t0].[Nome], [t0].[Cota], [t0].[Valor], [t0].[DataCadastro], [t0].[Ativo]
    FROM [dbo].[VcsBolao] AS [t0]
    INNER JOIN [dbo].[VcsConcurso] AS [t1] ON [t1].[ConcursoId] = [t0].[ConcursoId]
    INNER JOIN [dbo].[VcsLoteria] AS [t2] ON [t2].[LoteriaId] = [t1].[LoteriaId]
    WHERE DATEADD(ms, ((CONVERT(BigInt,((CONVERT(BigInt,DATEPART(HOUR, [t2].[HorarioEncerramento]))) * 36000000000) 
    + ((CONVERT(BigInt,DATEPART(MINUTE, [t2].[HorarioEncerramento]))) * 600000000) 
    + ((CONVERT(BigInt,DATEPART(SECOND, [t2].[HorarioEncerramento]))) * 10000000) 
    + ((CONVERT(BigInt,DATEPART(MILLISECOND, [t2].[HorarioEncerramento]))) * 10000))) / 10000) 
    % 86400000, DATEADD(day, (CONVERT(BigInt,((CONVERT(BigInt,DATEPART(HOUR, [t2].[HorarioEncerramento]))) 
    * 36000000000) + ((CONVERT(BigInt,DATEPART(MINUTE, [t2].[HorarioEncerramento]))) * 600000000) 
    + ((CONVERT(BigInt,DATEPART(SECOND, [t2].[HorarioEncerramento]))) * 10000000)
     + ((CONVERT(BigInt,DATEPART(MILLISECOND, [t2].[HorarioEncerramento]))) * 10000))) 
     / 864000000000, [t1].[DataSorteio])) > @p1
    

    Acho que vou dar uma pesquisada de como se utilizar procedures e utilizar elas nesse caso. 

    Se alguém tiver outra sugestão sou todo ouvidos. 

    Abraços.

    sábado, 28 de agosto de 2010 00:10
  • Qual é o tipo do campo no SQL ? Date, DateTime ou Smalldatetime ?

    se o campo for Date vc não pode adicionar horas, minutos, segundos e etc...


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    There is no place like 127.0.0.1
    Só existem 10 tipos de pessoas no mundo... as que leem em binario e as outras...
    Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    sábado, 28 de agosto de 2010 00:23
    Moderador
  • Datetime, 

    consegui com lambda adicionando primeiro as horas e depois os minutos, AddHours e AddMinutes, mas o sql gerado da medo. 

     

    sábado, 28 de agosto de 2010 00:25