executando consultas com o DateTime em onde a cláusula
-
28-09-2019 - |
Pergunta
Eu uso o SQL Server 2008 R2 como um armazenamento de dados.
Até agora, na máquina de teste, eu tinha a versão em inglês do software e costumava fazer consultas formatando o campo DateTime como
fromDate.ToString("MM/dd/yyyy");
Agora, implantei o banco de dados em outro servidor que está no idioma italiano. Vou mudar o formato no meu código para
fromDate.ToString("dd/MM/yyyy");
Existe uma maneira de fazer a consulta em um formato neutro?
obrigado!
EDITAR:
Esqueci de mencionar que estou usando Nettiers com Codesmith. Aqui está uma amostra completa
AppointmentQuery aq = new AppointmentQuery(true, true);
aq.AppendGreaterThan(AppointmentColumn.AppointmentDate, fromDate.ToString("MM/dd/yyyy"));
aq.AppendLessThan(AppointmentColumn.AppointmentDate, toDate.ToString("MM/dd/yyyy"));
AppointmentService aSvc = new AppointmentService();
TList<Appointment> appointmentsList = aSvc.Find(aq);
Solução
ISO 8601 Elementos de dados e formatos de intercâmbio - Intercâmbio de informações - Representação de datas e horários Permite o yyyy-mm-dd e o yyyymmdd. O SQL Server reconhece as especificações da ISO.
Embora o padrão permita que os formatos AAYYY-MM-DD e AHYYYMMDD para representações completas de data do calendário, se o dia [DD] for omitido, apenas o formato AAAA-MM é permitido. Ao proibir as datas da forma yyyymm, o padrão evita confusão com a representação truncada Yymmdd (ainda usada com frequência).
Eu prefiro o formato yyyymmdd, mas acho que é porque eu só sabia disso para começar, e para mim parece mais universal, tendo acabado de acabar com os personagens que podem ser considerados específicos do local.
Outras dicas
Você deve compartilhar o código que está usando para executar a consulta, mas acho que você está criando uma consulta SQL dinamicamente usando concativas de string para criar a consulta e os argumentos. Você prefere usar uma consulta parametrizada, então pode passar os dados como um objeto de data e não precisar converter uma string.
Por exemplo, se sua consulta pode ser algo assim
DateTime fromDate = DateTime.Now;
SqlCommand cmd = new SqlCommand(
"select * from Orders where fromDT = @fromDate", con);
cmd.Parameters.AddWithValue("@fromDate", fromDate);
...
Como um bom efeito colateral, isso reduzirá seu risco de injeção SQL.
Atualizar: Após a sua edição, que muda significativamente o contexto da pergunta, e tenho que admitir que não tenho conhecimento do projeto .NETTIERS. Mas por curiosidade você já tentou passar as instâncias de data diretamente como a seguir?
AppointmentQuery aq = new AppointmentQuery(true, true);
aq.AppendGreaterThan(AppointmentColumn.AppointmentDate, fromDate);
aq.AppendLessThan(AppointmentColumn.AppointmentDate, toDate);
AppointmentService aSvc = new AppointmentService();
TList<Appointment> appointmentsList = aSvc.Find(aq);
Pessoalmente, eu sempre uso yyyy-MM-dd
. Isso também o torna classificável como uma string.
No entanto, uma data é uma data é uma data. Não há necessidade de alterar a data para uma string. Em .net, usuário DateTime
.