【问题标题】:Convert Nvarchar DD/MM/YYYY to YYYY-MM-DD in SQL Query在 SQL 查询中将 Nvarchar DD/MM/YYYY 转换为 YYYY-MM-DD
【发布时间】:2019-06-05 07:45:32
【问题描述】:

您好,我的“用户”表中有一个名为“PersonalDetails_DOB”的列。

数据类型为 NVARCHAR(10),数据当前的“格式”为 DD/MM/YYYY。

我想将格式更改为 YYYY.MM.DD 或 YYYY-MM-DD,我该怎么做?

我已经尝试在 SQL 中运行查询:

 SELECT CONVERT(nvarchar(10), PersonalDetails_DOB, 102) as
 'PersonalDetails_DOB' FROM Users;

什么都没有发生,也不会改变任何日期,例如06/02/1967 至 1967.02.06

【问题讨论】:

  • 您的查询将PersonalDetails_DOB 视为日期,而实际上它是字符串。最好将其真正存储为DATE。只要将其存储为字符串 (NVARCHAR),您要么必须使用字符串操作来交换字符串部分,要么先将其转换为日期,然后再将其转换为另一个字符串。
  • @Zack 您需要先更新日期格式的值,然后才能更改列的数据类型。看我的回答。

标签: sql sql-server string date format


【解决方案1】:

也许你应该在转换之前先设置日期格式:

set dateformat dmy;
select PersonalDetails_DOB
    ,convert(nvarchar(10), cast(PersonalDetails_DOB as datetime), 102) as ANSI_DOB
    ,convert(nvarchar(10), cast(PersonalDetails_DOB as datetime), 120) as ODBC_DOB
from Users;

【讨论】:

    【解决方案2】:

    您可以尝试下面的查询来使用 SUBSTRING() 函数更新日期值格式及其数据类型,如下所示

    declare @PersonalDetails_DOB NVARCHAR(10)
    set @PersonalDetails_DOB = '13/10/2018' --dd/MM/yyyy
    
    select SUBSTRING(@PersonalDetails_DOB,7,4) + '-' + SUBSTRING(@PersonalDetails_DOB,4,2) 
    + '-' + SUBSTRING(@PersonalDetails_DOB,1,2) 
             -- yyyy-MM-dd
    
    create table Users(PersonalDetails_DOB NVARCHAR(10))
    insert into Users values ('01/10/2018')
    select * from Users --Before Update
    
    --Updating date values
    update Users
    set PersonalDetails_DOB = (
        SUBSTRING(@PersonalDetails_DOB,7,4) + '-' + SUBSTRING(@PersonalDetails_DOB,4,2) 
            + '-' + SUBSTRING(@PersonalDetails_DOB,1,2) 
    )where PersonalDetails_DOB is not null
    
    select * from Users --After Update
    
    --Change the datatype
    ALTER TABLE Users
    ALTER COLUMN PersonalDetails_DOB date;
    

    你可以找到现场演示Live Demo Here

    【讨论】:

      【解决方案3】:

      将日期存储为日期,而不是字符串。我建议您将值作为日期而不是字符串:

      SELECT CONVERT(date, PersonalDetails_DOB, 103) as PersonalDetails_DOB
      FROM Users;
      

      使用try_convert() 更安全:

      SELECT TRY_CONVERT(date, PersonalDetails_DOB, 103) as PersonalDetails_DOB
      FROM Users;
      

      要找到错误的值,您可以这样做:

      select PersonalDetails_DOB
      from users
      where  TRY_CONVERT(date, PersonalDetails_DOB, 103) is null;
      

      您可以根据需要转换回字符串。

      我建议您修复数据结构。这应该有效:

      update users
          set PersonalDetails_DOB = CONVERT(date, PersonalDetails_DOB, 103);
      
      alter users alter column PersonalDetails_DOB date;
      

      【讨论】:

      • 那么我需要将数据类型更改为“日期”而不是 Nvarchar 吗?这意味着我将丢失列中的所有数据?它是 Nvarchar 是有原因的,不记得为什么并将其更改为 DateTime 会在 Web App 中搞砸很多事情。同样使用您的代码,我收到以下错误:从字符串转换日期和/或时间时转换失败。
      • @ZackAntonyBucci 。 . .你的数据乱了。如果您想使用出生日期,您将需要花时间修复您的数据您的应用程序。关于为什么要使用正确的类型来存储数据的好课。
      【解决方案4】:

      你需要两个convert()函数:

      SELECT PersonalDetails_DOB, 
             CONVERT(VARCHAR(10), CONVERT(DATE, PersonalDetails_DOB, 103), 102)
      FROM Users;
      

      【讨论】:

      • 从字符串转换日期和/或时间时转换失败。
      • @Zack Antony Bucci:那么您的表包含与DD/MM/YYYY 不匹配的数据。这就是为什么您应该首先将日期存储为日期而不是字符串的原因。我建议您更改表格设计(重命名列,添加日期列PersonalDetails_DOB,用更新填充新列,删除旧列)。
      猜你喜欢
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 1970-01-01
      • 2016-05-05
      相关资源
      最近更新 更多