none
converter para data RRS feed

  • Pergunta

  • boas

    tenho uma coluna com datas em nvarchar(max)

    a data esta neste formato:

    30-11-2011

    dia-mes-ano

    Preciso de copia-la para a coluna teste mas em formato data. Para depois conseguir fazer uma pesquisa com datas, achar a mais pequena e maior...

    Mas preciso que se mantenha no mesmo formato. PAra não dar confusões.

    Penso que o formato deverá ser o datetime(7) né?

    obrigado


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    quinta-feira, 5 de abril de 2012 09:02

Respostas

  • Flashed,

    No caso, você terá que que converter para DATETIME e tratar a exibição desta informação.

    Segue um exemplo:

    DECLARE @dt    NVARCHAR(10)
    SET    @dt = '30-11-2011'

    DECLARE @dtConv    DATETIME
    SET    @dtConv    =    SUBSTRING(@dt,7,4) + SUBSTRING(@dt,4,2) + SUBSTRING(@dt,1,2)

    SELECT @dt 'Valor NVARCHAR', @dtConv 'Valor DATETIME', REPLACE(CONVERT(CHAR(10),@dtConv,103),'/','-') 'Valor Tratado'

    Att,


    Rafael Godoi Sabadin
    http://www.linkedin.com/in/rafaelgodoisabadin


    Classifique as respostas. O seu feedback é essencial.

    quinta-feira, 5 de abril de 2012 11:53
  • Bom dia Flashed,

    Eu faria da seguinte forma:

    update tabela set data = convert(datetime,F6,103)

    Segue abaixo um script de teste:

    create table #y
    (
    a nvarchar(max),
    b datetime
    )
    
    insert into #y values ('30-11-2011',null)
    update #y set b = convert(datetime,a,103) 

    Qualquer dúvida posta ae.

    Abraços

    • Marcado como Resposta Jonas São Paulo terça-feira, 10 de abril de 2012 10:57
    quinta-feira, 5 de abril de 2012 15:34
  • Flashed,

    Este campo data esta utilizando qual DataType?

    Você já tentou em conjunto com a função Convert, utilizar a parâmetro, 103 para formatação de data?

    Veja este exemplo:

    DECLARE @dt    NVARCHAR(10)
    SET    @dt = '30-11-2011'
    DECLARE @dtConv    DATETIME
    SET    @dtConv    =    SUBSTRING(@dt,7,4) + SUBSTRING(@dt,4,2) + SUBSTRING(@dt,1,2)
    Select Convert(Varchar(10),@dtConv,103) 'Valor DATETIME'


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quinta-feira, 5 de abril de 2012 17:11
  • Flashed, segue alguns exemplos, veja se te ajuda.

    -- declarando uma tabela temporária
    declare @t as table (ColunaTexto varchar(max), ColunaData date)
    
    -- populando com algumas datas no formato de texto, conforme exemplo da pergunta.
    insert into @t (ColunaTexto) values ('30-11-2011'),('10-01-2000'),('01-04-2012'),('21-09-1998')
    
    -- comun
    select * from @t
    
    -- trazendo a maior e menor data
    select MIN(convert(date,ColunaTexto,105)) as MenorDt,
           MAX(convert(date,ColunaTexto,105)) as MaiorDt
    from @t
    
    -- atualizando a coluna data no formato de data
    update @t set  ColunaData = convert(date,ColunaTexto,105)
    
    -- select final 
    select * from @t


    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino

    • Marcado como Resposta Jonas São Paulo terça-feira, 10 de abril de 2012 10:57
    quinta-feira, 5 de abril de 2012 20:25
  • Bom dia!

    Flashed,

    Acho que você não entendeu meu exemplo, se F6 é o campo que contém a "data" no datatype NVARCHAR e estou supondo que o campo data que você está tentando realizar o update está como DATETIME, tente realizar o update da seguinte forma:

    UPDATE tabela SET data = SUBSTRING(F6,7,4) + SUBSTRING(F6,4,2) + SUBSTRING(F6,1,2)

    Ou mesmo desta forma:

    UPDATE tabela SET data = CONVERT(DATETIME,F6,105)

    Você também impôs o seguinte critério: "Mas preciso que se mantenha no mesmo formato. PAra não dar confusões.". Bom, é neste ponto é necessário que você trate a exibição desse dado na aplicação.

    O exemplo abaixo retorna o campo data (datatype DATETIME) no formado DD/MM/AAAA:

    SELECT CONVERT(CHAR(10),data,103) FROM tabela

    No exemplo a seguir o campo data (datatype DATETIME) é retornado no seguinte formado DD-MM-AAAA, já que sua condição exigia que o dia, mês e ano fossem separados por hífen.

    SELECT REPLACE(CONVERT(CHAR(10),data,103),'/','-') FROM tabela

    Tudo o que foi proposto acima, você teria que criar uma coluna com o datatype DATETIME, mas o Leonardo postou uma forma interessante que contornar o problema, no caso você apenas queria que converter o dado NVARCHAR para DATETIME para achar a data mínima e máxima, porém penso que seria mais interessante você reestruturar seu banco inves de ficar realizando conversões de tipos de dados para utilizar funções agregadas.


    Rafael Godoi Sabadin
    http://www.linkedin.com/in/rafaelgodoisabadin


    Classifique as respostas. O seu feedback é essencial.

    • Marcado como Resposta Jonas São Paulo terça-feira, 10 de abril de 2012 10:57
    sábado, 7 de abril de 2012 14:02

Todas as Respostas

  • Flashed,

    No caso, você terá que que converter para DATETIME e tratar a exibição desta informação.

    Segue um exemplo:

    DECLARE @dt    NVARCHAR(10)
    SET    @dt = '30-11-2011'

    DECLARE @dtConv    DATETIME
    SET    @dtConv    =    SUBSTRING(@dt,7,4) + SUBSTRING(@dt,4,2) + SUBSTRING(@dt,1,2)

    SELECT @dt 'Valor NVARCHAR', @dtConv 'Valor DATETIME', REPLACE(CONVERT(CHAR(10),@dtConv,103),'/','-') 'Valor Tratado'

    Att,


    Rafael Godoi Sabadin
    http://www.linkedin.com/in/rafaelgodoisabadin


    Classifique as respostas. O seu feedback é essencial.

    quinta-feira, 5 de abril de 2012 11:53
  • estou a tnetar fazer algo deste genero..mas não dá

    update tabela set data = REPLACE(CONVERT(CHAR(10),F6,103),'/','-')

    onde F6 é o campo que tem a data em nvarchar(max)

    obrigado


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    quinta-feira, 5 de abril de 2012 13:44
  • Bom dia Flashed,

    Eu faria da seguinte forma:

    update tabela set data = convert(datetime,F6,103)

    Segue abaixo um script de teste:

    create table #y
    (
    a nvarchar(max),
    b datetime
    )
    
    insert into #y values ('30-11-2011',null)
    update #y set b = convert(datetime,a,103) 

    Qualquer dúvida posta ae.

    Abraços

    • Marcado como Resposta Jonas São Paulo terça-feira, 10 de abril de 2012 10:57
    quinta-feira, 5 de abril de 2012 15:34
  • Flashed,

    Este campo data esta utilizando qual DataType?

    Você já tentou em conjunto com a função Convert, utilizar a parâmetro, 103 para formatação de data?

    Veja este exemplo:

    DECLARE @dt    NVARCHAR(10)
    SET    @dt = '30-11-2011'
    DECLARE @dtConv    DATETIME
    SET    @dtConv    =    SUBSTRING(@dt,7,4) + SUBSTRING(@dt,4,2) + SUBSTRING(@dt,1,2)
    Select Convert(Varchar(10),@dtConv,103) 'Valor DATETIME'


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quinta-feira, 5 de abril de 2012 17:11
  • Flashed, segue alguns exemplos, veja se te ajuda.

    -- declarando uma tabela temporária
    declare @t as table (ColunaTexto varchar(max), ColunaData date)
    
    -- populando com algumas datas no formato de texto, conforme exemplo da pergunta.
    insert into @t (ColunaTexto) values ('30-11-2011'),('10-01-2000'),('01-04-2012'),('21-09-1998')
    
    -- comun
    select * from @t
    
    -- trazendo a maior e menor data
    select MIN(convert(date,ColunaTexto,105)) as MenorDt,
           MAX(convert(date,ColunaTexto,105)) as MaiorDt
    from @t
    
    -- atualizando a coluna data no formato de data
    update @t set  ColunaData = convert(date,ColunaTexto,105)
    
    -- select final 
    select * from @t


    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino

    • Marcado como Resposta Jonas São Paulo terça-feira, 10 de abril de 2012 10:57
    quinta-feira, 5 de abril de 2012 20:25
  • Bom dia!

    Flashed,

    Acho que você não entendeu meu exemplo, se F6 é o campo que contém a "data" no datatype NVARCHAR e estou supondo que o campo data que você está tentando realizar o update está como DATETIME, tente realizar o update da seguinte forma:

    UPDATE tabela SET data = SUBSTRING(F6,7,4) + SUBSTRING(F6,4,2) + SUBSTRING(F6,1,2)

    Ou mesmo desta forma:

    UPDATE tabela SET data = CONVERT(DATETIME,F6,105)

    Você também impôs o seguinte critério: "Mas preciso que se mantenha no mesmo formato. PAra não dar confusões.". Bom, é neste ponto é necessário que você trate a exibição desse dado na aplicação.

    O exemplo abaixo retorna o campo data (datatype DATETIME) no formado DD/MM/AAAA:

    SELECT CONVERT(CHAR(10),data,103) FROM tabela

    No exemplo a seguir o campo data (datatype DATETIME) é retornado no seguinte formado DD-MM-AAAA, já que sua condição exigia que o dia, mês e ano fossem separados por hífen.

    SELECT REPLACE(CONVERT(CHAR(10),data,103),'/','-') FROM tabela

    Tudo o que foi proposto acima, você teria que criar uma coluna com o datatype DATETIME, mas o Leonardo postou uma forma interessante que contornar o problema, no caso você apenas queria que converter o dado NVARCHAR para DATETIME para achar a data mínima e máxima, porém penso que seria mais interessante você reestruturar seu banco inves de ficar realizando conversões de tipos de dados para utilizar funções agregadas.


    Rafael Godoi Sabadin
    http://www.linkedin.com/in/rafaelgodoisabadin


    Classifique as respostas. O seu feedback é essencial.

    • Marcado como Resposta Jonas São Paulo terça-feira, 10 de abril de 2012 10:57
    sábado, 7 de abril de 2012 14:02
  • Boas

    Estive a estudar e revi o tópico desde e inicio é ja entendi tudo direitinho :)

    Esta a funcionar 

    obrigado a todos pela ajuda


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    terça-feira, 10 de abril de 2012 10:58