[英]Convert Nvarchar DD/MM/YYYY to YYYY-MM-DD in SQL Query
Hi I have a column in my 'Users' table called 'PersonalDetails_DOB'.嗨,我的“用户”表中有一个名为“PersonalDetails_DOB”的列。
The data type is a NVARCHAR(10) and the 'format' the data is currently in DD/MM/YYYY.数据类型是 NVARCHAR(10) 并且数据的“格式”当前为 DD/MM/YYYY。
I want to change the format to YYYY.MM.DD or YYYY-MM-DD, how would I do this?我想将格式更改为 YYYY.MM.DD 或 YYYY-MM-DD,我该怎么做?
I have already tried a running a query in SQL:我已经尝试过在 SQL 中运行查询:
SELECT CONVERT(nvarchar(10), PersonalDetails_DOB, 102) as
'PersonalDetails_DOB' FROM Users;
Nothing happens and it doesn't change any date from eg 06/02/1967 to 1967.02.06什么都没有发生,它不会改变任何日期,例如 06/02/1967 到 1967.02.06
Store dates as dates, not strings.将日期存储为日期,而不是字符串。 I recommend you pull the value as a date and not a string:我建议您将该值作为日期而不是字符串:
SELECT CONVERT(date, PersonalDetails_DOB, 103) as PersonalDetails_DOB
FROM Users;
You are safer using try_convert()
:使用try_convert()
更安全:
SELECT TRY_CONVERT(date, PersonalDetails_DOB, 103) as PersonalDetails_DOB
FROM Users;
To find the bad values, you can do:要查找错误值,您可以执行以下操作:
select PersonalDetails_DOB
from users
where TRY_CONVERT(date, PersonalDetails_DOB, 103) is null;
You can convert back a string if you want.如果需要,您可以转换回字符串。
I would recommend that you fix the data structure.我建议您修复数据结构。 This should work:这应该有效:
update users
set PersonalDetails_DOB = CONVERT(date, PersonalDetails_DOB, 103);
alter users alter column PersonalDetails_DOB date;
You need two convert()
function :你需要两个convert()
函数:
SELECT PersonalDetails_DOB,
CONVERT(VARCHAR(10), CONVERT(DATE, PersonalDetails_DOB, 103), 102)
FROM Users;
You can try the below query to update the date values format and also their data type using SUBSTRING() function as shown below您可以尝试使用以下查询来使用 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;
You can find the live demo Live Demo Here你可以在这里找到现场演示现场演示
Maybe you should first set dateformat before conversion:也许您应该在转换之前先设置日期格式:
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.