Конвертировать Nvarchar DD / MM / YYYY в YYYY-MM-DD в SQL-запросе - PullRequest
0 голосов
/ 10 января 2019

Привет, у меня в таблице 'Users' есть столбец с именем PersonalDetails_DOB.

Тип данных - это NVARCHAR (10), а «формат» данных в настоящее время - ДД / ММ / ГГГГ.

Я хочу изменить формат на ГГГГ.ММ.ДД или ГГГГ-ММ-ДД, как мне это сделать?

Я уже пытался выполнить запрос в SQL:

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

Ничего не происходит, и это не меняет никакой даты, например, С 02.06.1967 по 1967.02.06

Ответы [ 4 ]

0 голосов
/ 11 января 2019

Может быть, вам следует сначала установить формат даты перед преобразованием:

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;
0 голосов
/ 10 января 2019

Вам нужно две convert() функции:

SELECT PersonalDetails_DOB, 
       CONVERT(VARCHAR(10), CONVERT(DATE, PersonalDetails_DOB, 103), 102)
FROM Users;
0 голосов
/ 10 января 2019

Вы можете попробовать следующий запрос для обновления формата значений даты, а также их типа данных, используя функцию 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;

Вы можете найти живую демонстрацию Демонстрацию здесь

0 голосов
/ 10 января 2019

Храните даты как даты, а не строки. Я рекомендую вам указывать значение в виде даты, а не строки:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...