Formato DateTime para o formato SQL usando C #


111

Estou tentando salvar o formato de data e hora atual de C # e convertê-lo em um formato de data do SQL Server yyyy-MM-dd HH:mm:sspara que possa usá-lo em minha UPDATEconsulta.

Este foi meu primeiro código:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd HH:mm:ss");

A saída na data está correta, mas a hora é sempre "12:00:00", então mudei meu código para o seguinte:

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " + 
myDateTime.TimeOfDay.ToString("HH:mm:ss");

Isso me deu este erro de compilação:

FormatException não foi tratada

E sugeriu que preciso analisar. Então, tentei fazer isso com meu código de acordo com minha pesquisa aqui no StackOverflow:

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " + 
myDateTime.Parse.TimeOfDay.ToString("HH:mm:ss");

ou

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " + 
myDateTime.tryParse.TimeOfDay.ToString("HH:mm:ss");

Mas está me dizendo que é um método que não é válido para um determinado contexto. Tentei buscar soluções para o meu problema e estou paralisado há duas horas. Ainda sou um pouco novo em C #, você pode me ajudar, por favor?


Você já olhou DateTime.TryParseExact?
Tim


3
Por que não usar um parâmetro para atualizar o DateTimeou você o está armazenando como uma string? Também ToStringna Dateimplicaria que o tempo é sempre12:00:00
V4Vendetta

3
Você deve usar uma consulta parametrizada com um parâmetro do tipo DATETIMEe então você pode evitar fazer tudo isso convertendo para frente e para trás de e para uma representação de string!
marc_s

5
Como já foi dito, usar parâmetros e apenas manter tudo como um datetimeseria um bom começo. Melhor ainda, por que você está passando a hora atual para o servidor - ela tem uma GETDATE()função que pode ser chamada inteiramente no lado do servidor.
Damien_The_Unbeliever

Respostas:


219

tente isso abaixo

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");

muito obrigado, eu estava tentando string sqlFormattedDate = myDateTime.DateTime ... por algum motivo, é isso que eu quero alcançar.
Ace Caserya

Minha pesquisa em stackoverflow continua me referindo a uma referência errada, embora a pergunta tenha sido respondida várias vezes, novatos como eu não conseguem se relacionar por causa disso. Desculpe a todos, encerrarei a pergunta assim que puder.
Ace Caserya

1
Acho que o formato C # "Classificável" faz a mesma coisa. Portanto, você pode apenas fazer myDateTime.ToString ("s");
ProVega

@ProVega não parece o mesmo (.ToString ('s') tem um T em vez de um espaço entre a data e a hora) - mas posso confirmar que eles são analisados ​​da mesma forma pelo servidor SQL com ou sem o T ( Estou em 2012). Comecei a usar 's' como meu formato de data e hora de registro, então vou continuar com isso, obrigado!
Ian Grainger

Sim, na página oficial CAST e CONVERT (Transact-SQL) , eles usam o nome "ODBC canônico" para o formulário com um espaço separando yyyy-MM-ddda hora do dia, e o nome "ISO8601" para o formulário onde está o caractere de separação a T. Mas sim, ambas as formas são convertidas implicitamente (e corretamente) em a datetime.
Jeppe Stig Nielsen

45

Usar o formato de data e hora padrão "s" também garantirá a compatibilidade de internacionalização (MM / dd versus dd / MM):

myDateTime.ToString("s");

=> 2013-12-31T00:00:00

Opções completas: (código: resultado da amostra)

d: 6/15/2008 
D: Sunday, June 15, 2008 
f: Sunday, June 15, 2008 9:15 PM 
F: Sunday, June 15, 2008 9:15:07 PM 
g: 6/15/2008 9:15 PM 
G: 6/15/2008 9:15:07 PM 
m: June 15 
o: 2008-06-15T21:15:07.0000000 
R: Sun, 15 Jun 2008 21:15:07 GMT 
s: 2008-06-15T21:15:07 
t: 9:15 PM 
T: 9:15:07 PM 
u: 2008-06-15 21:15:07Z 
U: Monday, June 16, 2008 4:15:07 AM 
y: June, 2008 

'h:mm:ss.ff t': 9:15:07.00 P 
'd MMM yyyy': 15 Jun 2008 
'HH:mm:ss.f': 21:15:07.0 
'dd MMM HH:mm:ss': 15 Jun 21:15:07 
'\Mon\t\h\: M': Month: 6 
'HH:mm:ss.ffffzzz': 21:15:07.0000-07:00

Compatível com .NET Framework: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0
Referência: DateTime.ToStringMétodo


1
Isso não é refinado o suficiente (perde os milissegundos) e causará problemas em consultas que dependem de ordenação por data.
reijerh,

Para obter horas e minutos também, você pode usar esta conversão: string sqlFormattedDate = YourDate.ToString ("yyyy-MM-ddTHH: mm: ss", System.Globalization.CultureInfo.InvariantCulture);
netfed

9

A resposta correta já foi dada "usar parâmetros". Formatar uma data e passá-la como string para o SQL-Server pode levar a erros, pois depende das configurações de como a data é interpretada no servidor. Na Europa, escrevemos '1.12.2012' para indicar 1º de dezembro de 2012, enquanto em outros países isso pode ser tratado como 12 de janeiro.

Ao emitir declarações diretamente no SSMS, uso o formato yyyymmdd que parece ser bastante geral. Não encontrei nenhum problema nas várias instalações em que trabalhei até agora.

Existe outro formato raramente usado, que é um pouco estranho, mas funciona para todas as versões:

select { d '2013-10-01' }

retornará no dia primeiro de outubro de 2013.

select { ts '2013-10-01 13:45:01' }

voltará em 1º de outubro, 13:45:01

Aconselho fortemente o uso de parâmetros e nunca formate seu próprio código SQL colando fragmentos de instrução formatados desenvolvidos internamente. É uma entrada para injeção de SQL e erros estranhos (formatar um valor flutuante é outro problema potencial)


3

Seu primeiro código funcionará fazendo isso

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss"); //Remove myDateTime.Date part 

3

Seu problema está na propriedade "Data" que trunca DateTimesomente até a data. Você poderia colocar a conversão assim:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss"); // <- No Date.ToString()!

2

A resposta que eu procurava era:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss");

Também aprendi que você pode fazer desta forma:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString(myCountryDateFormat);

onde myCountryDateFormat pode ser alterado para atender às alterações dependendo do requisito.

Observe que a tag "Esta pergunta pode já ter uma resposta aqui:" não respondeu realmente à pergunta porque, como você pode ver, foi usado um ".Data" em vez de omiti-lo. É muito confuso para novos programadores de .NET


2

se você deseja armazenar a data atual na tabela para que possa usar

GETDATE ();

ou passe esta função como um parâmetro

por exemplo. 'update tblname set curdate = GETDATE () where colname = 123'


1

Por que não pular a string completamente:

SqlDateTime myDateTime = DateTime.Now;

1

Seu problema está na Datepropriedade que trunca DateTimeaté hoje. Você poderia colocar a conversão assim:

DateTime myDateTime = DateTime.Now;

string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss");

Obrigado. Exatamente o que eu estava procurando;) Surpresa, a Microsoft não adicionou um sinalizador ou comando para fazer isso de forma mais breve.
Zeek2

0

Outra solução para passar DateTime de C # para SQL Server, independentemente das configurações de idioma do SQL Server

supostamente, suas configurações regionais mostram a data como dd.MM.aaaa (padrão alemão '104'), então

DateTime myDateTime = DateTime.Now;
string sqlServerDate ="CONVERT("date,'"+myDateTime+"',104)"; 

passa a variável datetime C # para a variável do tipo Data do SQL Server, considerando o mapeamento de acordo com as regras "104". A data do Sql Server obtém aaaa-MM-dd

Se suas Configurações regionais exibirem DateTime de maneira diferente, use a correspondência apropriada da Tabela CONVERTER do SQL Server

veja mais sobre Regras: https://www.techonthenet.com/sql_server/functions/convert.php


0

Acho que o problema eram as duas aspas simples faltando.

Este é o sql que executo para o MSSMS:

WHERE checktime >= '2019-01-24 15:01:36.000' AND checktime <= '2019-01-25 16:01:36.000'

Como você pode ver, existem duas aspas simples, portanto, seus códigos devem ser:

string sqlFormattedDate = "'" + myDateTime.Date.ToString("yyyy-MM-dd") + " " + myDateTime.TimeOfDay.ToString("HH:mm:ss") + "'";

Use aspas simples para cada string no MSSQL ou mesmo no MySQL. Eu espero que isso ajude.


0

Vamos usar a classe SqlDateTime integrada

new SqlDateTime(DateTime.Now).ToSqlString()

Mas ainda precisa verificar se há valores nulos. Isso lançará uma exceção de estouro

new SqlDateTime(DateTime.MinValue).ToSqlString()

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.



-1

Se você deseja atualizar uma tabela com esse dateTime, pode usar sua string sql como este exemplo:

int fieldId;
DateTime myDateTime = DateTime.Now
string sql = string.Format(@"UPDATE TableName SET DateFieldName='{0}' WHERE FieldID={1}, myDateTime.ToString("yyyy-MM-dd HH:mm:ss"), fieldId.ToString());

2
Essa questão já foi respondida e aceita com uma solução mais elegante. E você está perdendo um fechamento ".
Jan

-1
   DateTime date1 = new DateTime();

    date1 = Convert.ToDateTime(TextBox1.Text);
    Label1.Text = (date1.ToLongTimeString()); //11:00 AM
    Label2.Text = date1.ToLongDateString(); //Friday, November 1, 2019;
    Label3.Text = date1.ToString();
    Label4.Text = date1.ToShortDateString();
    Label5.Text = date1.ToShortTimeString();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.