terça-feira, 17 de setembro de 2013

Dica de SQL - Inserindo data no Formato dd/MM/aaaa




















Todo mundo já passou por algum tipo de problema na hora de fazer uma inserção, ou atualização em um banco de dados. Você passa a data no formato (dd/MM/aaaa) ele grava em outro (aaaa/MM/dd), (aaaa/dd/MM), ou qualquer outro formato padrão que esteja configurado no servidor.

Esse é um problema comum, pois tem haver com as configurações de data e hora do servidor (geralmente configurados no padrão EN).

Para inserirmos uma data de forma correta, independete do formato do servidor, temos que converter o valor.

Vamos criar uma tabela temporária e tentar inserir uma data no formato dd/MM/aaaa (30/12/2013).

1.º - CREATE TABLE #tmpTable (data DATE)
2.º - INSERT INTO #tmpTable (data) VALUES ('30/12/2013')

O seguinte erro é apresentado:





Isso aconteceu pois o sistema entendeu que estamos inserindo o mês 30, do dia 12, do ano de 2013, quando na verdade estamos inserindo o dia 30, do mês 12, de ano de 2013.

Para essa inserção/atualização funcionar vamos converter o formato utilizando a seguinte síntaxe:
INSERT INTO #tmpTable (data) VALUES (CONVERT(DATETIME,'30/12/2013',103))



Bem, essa é apenas uma dica simples de como inserir a data no formato dd/MM/aaaa em um campo do tipo DATE ou DATETIME.

6 comentários:

  1. Prezado Fábio,
    Muito bom seu artigo. Com ele consegui resolver um problema de inserção e atualização de dados com VB.net e SQL Server.
    Parabéns

    ResponderExcluir
    Respostas
    1. Olá William,
      Preciso de sua ajuda estou fazendo um projeto no trabalho de escola, não estou conseguindo inserir dados como DATA e HORA no minha tabela mostra não foi possível converter a minha variavel que esta no textbox no tipo interge.

      Excluir
    2. Private Sub CadastarProtocolo()
      Using con As SqlConnection = GetConnectionSQLServer()
      Try
      con.Open()
      Dim sql As String = "INSERT INTO TB_PROTOCOLO (N_PROTOCOLO, ATENDIMENTO, ID_SITUACAO, DATA, HORA, DATA_FECHAMENTO, HORA_FECHAMENTO, ID_CLIENTE, ID_DEPARTAMENTO, ID_CONTATO, ID_SISTEMA, ID_ASSUNTO, HISTORICO, ID_USUARIO)" _
      & " VALUES (@N_PROTOCOLO, @ATENDIMENTO, @ID_SITUACAO, CONVERT(DATE,'@DATA',103), CONVERT(TIME,'@HORA',108), CONVERT(DATE,'@DATA_FECHAMENTO',103) , CONVERT(TIME,'@HORA_FECHAMENTO',108), @ID_CLIENTE, @ID_DEPARTAMENTO, @ID_CONTATO, @ID_SISTEMA, @ID_ASSUNTO, @HISTORICO, @ID_USUARIO)"
      Dim cmd As SqlCommand = New SqlCommand(sql, con)



      Dim data, hora As String
      Dim atendimento As String

      If rbtnAtivo.Checked = True And rbtnReceptivo.Checked = False Then
      atendimento = "ATIVO"
      ElseIf rbtnReceptivo.Checked = True And rbtnAtivo.Checked = False Then
      atendimento = "RECEPTIVO"
      Else
      atendimento = ""
      End If

      If lblTipoStatus.Text = "N" Then
      data = CDate(Now).ToString("dd/MM/yyyy")
      hora = TimeOfDay.ToString("HH:mm:ss")
      Else
      data = ""
      hora = ""
      End If

      Excluir
  2. Respostas
    1. Olá Leonardo, boa tarde! 103 é o formato de data utilizado pelo SQL. Veja nesse link os formatos disponiveis. Abraços!
      https://www.mssqltips.com/sqlservertip/1145/date-and-time-conversions-using-sql-server/

      Excluir
  3. cmd.Parameters.Add(New SqlParameter("@N_PROTOCOLO", SqlDbType.Char, 14, "N_PROTOCOLO"))
    cmd.Parameters.Add(New SqlParameter("@ATENDIMENTO", SqlDbType.VarChar, 9, "ATENDIMENTO"))
    cmd.Parameters.Add(New SqlParameter("@ID_SITUACAO", SqlDbType.Int)).Value = lblIDSituacao.Text
    cmd.Parameters.Add(New SqlParameter("@DATA", SqlDbType.Date, "DATA"))
    cmd.Parameters.Add(New SqlParameter("@HORA", SqlDbType.Time, "HORA"))
    cmd.Parameters.Add(New SqlParameter("@DATA_FECHAMENTO", SqlDbType.Date, "DATA_FECHAMENTO"))
    cmd.Parameters.Add(New SqlParameter("@HORA_FECHAMENTO", SqlDbType.Time, "HORA_FECHAMENTO"))
    cmd.Parameters.Add(New SqlParameter("@ID_CLIENTE", SqlDbType.Int)).Value = lblIDEmpresa.Text
    cmd.Parameters.Add(New SqlParameter("@ID_DEPARTAMENTO", SqlDbType.Int)).Value = lblIDDepartamento.Text
    cmd.Parameters.Add(New SqlParameter("@ID_CONTATO", SqlDbType.Int)).Value = lblIDContato.Text
    cmd.Parameters.Add(New SqlParameter("@ID_SISTEMA", SqlDbType.Int)).Value = lblIDSistema.Text
    cmd.Parameters.Add(New SqlParameter("@ID_ASSUNTO", SqlDbType.Int)).Value = lblIDAssunto.Text
    cmd.Parameters.Add(New SqlParameter("@HISTORICO", SqlDbType.VarChar, 255, "HISTORICO"))
    cmd.Parameters.Add(New SqlParameter("@ID_USUARIO", SqlDbType.Int)).Value = lblAtendente.Text

    cmd.Parameters("@N_PROTOCOLO").Value = txtNprotocolo.Text
    cmd.Parameters("@ATENDIMENTO").Value = atendimento
    cmd.Parameters("@DATA").Value = Convert.ToDateTime(txtData.Text)
    cmd.Parameters("@HORA").Value = Convert.ToDateTime(txtHora.Text)
    cmd.Parameters("@DATA_FECHAMENTO").Value = Convert.ToDateTime(data)
    cmd.Parameters("@HORA_FECHAMENTO").Value = Convert.ToDateTime(hora)
    cmd.Parameters("@HISTORICO").Value = txtInformacao.Text

    cmd.ExecuteNonQuery()

    MsgBox("REGISTRO SALVO COM SUCESSO...")

    Catch ex As Exception
    MsgBox(ex.Message)
    Finally
    con.Close()
    End Try
    End Using
    End Sub

    ResponderExcluir