Jump to content
SérgioAlmeida

[Resolvido] SQL Server - Dúvidas com select por data com condição >< ou =

Recommended Posts

SérgioAlmeida

Olá a todas, antes de mais desculpem alguma falta de rigor na apresentação do meu tópico, mas como sou um membro recente, não sei muito bem como isto funciona :)

O meu tópico é um bocado mistura de Sql e C#, sendo o principal problema numa query.

Então é assim, eu estou a desenvolver uma aplicação em C# de Gestão de cemitérios e deparei-me com um problema na orientação a objectos.

Gostaria de tirar algumas dúvidas acerca da ligação do C# ao Sql.

--

Esta é a minha construção da class.

class Obitos

{

private int exemplo1;

private string exemplo2;

private string data; -->

* uma das dúvidas que tenho é aqui, como tive bastantes problemas por utilizar DateTime (não sabia como devia proceder na contrução da class, tendo uma variável de tipo data), acabei por converter qualquer data para string e apresenta-lá como tal.

public Obitos()

{

this.exemplo1= 0;

this.exemplo2= "";

this.data = "";

}

public Obitos(int exemplo1, string exemplo2, string data)

{

this.exemplo1= exemplo1;

this.exemplo2= exemplo2;

this.data= data;

}

public int Exemplo1

{ get; set; }

public string Exemplo1

{ get; set; }

public string Data

{ get; set; }

*Na aplicação criei uma função que me fizesse a mudança automática do estado do corpo, passados 8 anos depois de sepultado.

o programa calcula a data atual, retira exactamente 8 anos e assim sendo procura na base de dados todos os óbitos que não sejas ossadas e que tenham sido enterrados nessa data ou antes da mesma e atualiza-os.

*Este seria o principal problema, a query

SELECT * FROM OBITOS WHERE dataenterro <= '"+data+"' and estadoobito != 'Ossadas'

Já tentei trabalhar com between no sql, mas este só funciona entre datas e eu gostaria de selecionar todas as datas menores ou iguas à "dataresultado".

Talvez esteja a ser um pouco alargado demais no assunto, mas para me tentar explicar da melhor maneira teve de ser.

O real problema encontrasse no resultado, eu apresento as datas na base de dados em formato dd-mm-yyyy.

Fazendo a função agora seria '18-06-2015' -8anos. 18-06-2007

SELECT * FROM OBITOS WHERE dataenterro <= '18-06-2007' and estadoobito != 'Ossadas'

Digamos que tínhamos 2 óbitos, onde as datas de enterro seriam

15-06-2014

18-07-2009

com nenhumas destas datas a função devia encontrar resultados na base de dados retirando os 8 anos, pois nenhuma das 2 resultam de uma data menor ou igual, o problema está em que o calculo está somente a ser feito no dia '18-**-**', assim sendo, encontra-me os 2 resultados.

Este ditado todo seria para que, se possível, alguém com mais experiência me pudesse arranjar uma solução, seja ela na construção da class, mudando de string para DateTime ou mesmo na query :D

Agradecendo qualquer ajuda que possa ser dada, termino o tópico.

Cumprimentos a todos,

Sérgio Almeida.

Share this post


Link to post
Share on other sites
Rechousa

Viva,

Para tratamento de datas, deves em C# utilizar DateTime e em SQL Server, deves utlizar Date ou DateTime (entre outros). Como possivelmente só precisas da data, o tipo de dados DATE em SQL Server serve perfeitamente (SQL igual ou superior a 2008).

Depois, para escrever queries ad-hoc, não deves NUNCA utilizar concatenação de strings (SELECT * FROM OBITOS WHERE dataenterro <= '"+data+"'). Deves sim, utilizar parâmetros, exemplo:

SELECT * FROM OBITOS WHERE dataenterro <= @DataEnterro AND....

E envias, a valor da variável @DataEnterro como parâmetro, exemplo: http://www.dotnetperls.com/sqlparameter

Desta forma, ficas protegido contra SQL Injection e não precisas de andar a fazer casts de string para data e data para string.

Se sempre quiseres filtrar registos por data, em SQL Server, utiliza o formato aaaammdd (ano mes dia), exemplo:

SELECT * FROM OBITOS WHERE dataenterro <= '20070618'

Este formato funciona sempre, independentemente da linguagem e date format que possas ter.

Se precisares de retirar 8 anos à data atual, então a query seria:

SELECT * FROM dbo.readyDocuments WHERE Date <= DATEADD(yy, -8, GETDATE())

Espero ter ajudado,

  • Vote 1

Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
SérgioAlmeida

Rechousa, muito obrigado por tudo, as dúvidas foram sim tiradas e tirei a conclusão que estou a fazer querys inseguras e tenho de me informar mais acerca de como as fazer com parâmetros.

O meu obrigado e boa continuação,

Sérgio Almeida.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.