Faran Saleem Ответов: 2

Нужно преобразовать nvarchar в правильный формат datetime SQL


Привет,

Мне снова нужна твоя помощь.
Я tly по настоящее время, пытаясь преобразовать nvarchar значение в правильном формате datetime. В SQL Local_time есть столбец nvarchar, и он имеет значения типа 1160119104041, если я разберу его, то он будет выглядеть как '1' 'yy' 'mm' 'dd' 'hh' 'mm' ss'.
То, что я хочу показать, похоже на 2016-01-01 10:40:41.

Обратите внимание, что в значении nvarchar доступен дополнительный 1, который я хочу удалить при отображении правильной даты и времени.

Я был бы очень благодарен Вам за помощь и с нетерпением жду ее.

Что я уже пробовал:

Поискал в интернете и google, но я нашел такие решения, как преобразование nvarchar в datetime, но не с форматированием

2 Ответов

Рейтинг:
19

Suvendu Shekhar Giri

Вы можете использовать LEFT() и RIGHT() так поступать.
Пример:

declare @test varchar(30)
set @test='1160119104041'

select '20'+left(right(@test,LEN(@test)-1),2)+'-'+left(right(@test,LEN(@test)-3),2)+'-'+left(right(@test,LEN(@test)-5),2)+' '+left(right(@test,LEN(@test)-7),2)+':'+left(right(@test,LEN(@test)-9),2)+':'+left(right(@test,LEN(@test)-11),2)


Возможно, вы захотите бросить его на DATETIME с помощью CAST(expressio AS DATETIME).

Примечание: это просто способ. Вы все еще можете искать лучшие варианты или предложения.
Возможно, Вам также нужно подумать, что делать, если год 98, и вы хотите, чтобы это был 1998!

Надеюсь, это поможет :)


Обновление
Вы можете создать такую функцию, как -
CREATE FUNCTION GetDateFromVarchar
(
	@InputValue VARCHAR(30)
)
RETURNS DATETIME
AS
BEGIN
	DECLARE @ReturnValue VARCHAR(30)

	SELECT @ReturnValue= '20'+LEFT(RIGHT(@InputValue,LEN(@InputValue)-1),2)+'-'+LEFT(RIGHT(@InputValue,LEN(@InputValue)-3),2)+'-'+LEFT(RIGHT(@InputValue,LEN(@InputValue)-5),2)+' '+LEFT(RIGHT(@InputValue,LEN(@InputValue)-7),2)+':'+LEFT(RIGHT(@InputValue,LEN(@InputValue)-9),2)+':'+LEFT(RIGHT(@InputValue,LEN(@InputValue)-11),2)

	RETURN CAST(@ReturnValue AS DATETIME)

END
GO

Примечание:не рекомендуется копировать код вставки. Проверьте и измените в соответствии с вашими потребностями. Я еще не проверял это, но должно сработать.


Faran Saleem

Спасибо за ваш ответ..:)

Но вопрос этот будет преобразовывать только определенную дату из этого столбца. Что я хочу, так это выполнить эту вещь на каждой записи этого столбца, чтобы я не мог использовать параметры и устанавливать значение каждый раз.

Suvendu Shekhar Giri

Вам просто нужно заменить @test с именем современный цветочный колонка печати в SELECT запрос. Вы также можете создать FUNCTION и звоните туда, где когда-либо потребуется.
Дайте мне знать, если вам нужна помощь в создании FUNCTION.

Faran Saleem

Да, конечно, это было бы очень полезно..:) а также, если вы можете сказать мне синтаксис того, как я могу привести его после преобразования в правильный формат..:)

Faran Saleem

А еще я только что прогнал ваш запрос.. я бы заменил при тесте с моим именем столбца, local_time.. но это дает ошибку " недопустимый параметр длины, переданный правой функции"

Suvendu Shekhar Giri

Пожалуйста, проверьте обновленное решение

Suvendu Shekhar Giri

Всегда ли ожидается, что в этом столбце будут такие данные, как "1160119104041", или есть какие-то отклонения?

Faran Saleem

Извините меня за то, что были некоторые значения, длина которых была меньше 13, и поэтому он бросал эту ошибку..но я просто проверил ее на столбце даты, где есть только дата, а не время.. например, 1160119.. и он возвращает такие значения, как 20.1-60-12

Рейтинг:
1

#realJSOP

0) Какой идиот проектирует базу данных SQL для хранения datetime в виде nvarchar?

1) Какой "1"вы хотите раздеть? В начале или в конце? Знаете ли вы вообще, какова фактическая цель дополнительного "1" (почему он там)?

2) судя по тому, как отображается ваша строка nvarchar, нет никакого способа разобрать эту строку в datetime с какой-либо уверенностью в том, что год является точным, потому что это не 4-значный год.