Преобразование varchar ‘чч:мм:сс’ в дату и время чч:мм:сс в SQL Server

#sql-server #datetime

Вопрос:

Я попытался преобразовать varchar переменную, хранящуюся в моей базе данных, HH:MM:SS в фактический datetime формат HH:MM:SS. Я действительно получил значение HH:MM:SS, но попытка также сопровождалась префиксом ГГГГ:ММ:ДД вместе с ожидаемым результатом.

Ниже приведен код, который я использовал для преобразования этого varchar значения в HH:MM:SS, и полученный результат.

Код, который я пробовал :

 DECLARE @Duration Varchar(10)
SET @Duration = '00:01:23'

SELECT CONVERT(datetime, Duration, 8) AS duration
 

Результат, который я получил :

 1900-01-01 00:01:23.000
 

Ожидаемый результат:

 00:01:23
 

Пожалуйста, дайте мне знать, что в этом нужно изменить. Спасибо!

Комментарии:

1. Это неверное ожидание. Это не дата-время, это всего лишь время. Продолжительность-это не свидание. Это тоже не префиксы — datetime , date , time и т. Д. Являются двоичными типами, а не строками

2. Похоже, вам нужен тип данных time, а не тип данных datetime

Ответ №1:

Если вы хотите time , почему вы переходите в datetime ? Учитывая название, неудивительно, что вы получаете и дату, и время. Попробуй:

 DECLARE @Duration char(8) = '00:01:23';
SELECT duration = CONVERT(time(0), @Duration);
 

Результаты:

Продолжительность
00:01:23

Просто имейте в виду, что time (как и любой тип даты/времени) не предназначен для представления продолжительности или интервала. Потому что что происходит, когда ваша продолжительность или интервал превышают 24 часа?

Комментарии:

1. Это немного … необычно, что SQL Server еще не имеет правильного типа интервала

2. @PanagiotisKanavos Да, но, честно говоря, добавлять типы сложно. Типы, добавленные в 2008 году, не совсем имели идеальный послужной список, и с тех пор они не пробовали.

3. Спасибо всем вам за оперативную помощь. Я был немного сбит с толку этим, но ваш код помог мне. еще раз спасибо!

Ответ №2:

То, что вы опубликовали, — это время, а не дата или время. Продолжительность-это не свидание. Типы дат являются двоичными, у них нет префиксов.

Вы можете определить время непосредственно с помощью :

 Declare @Duration time ='00:01:23'
 

Или вы можете привести строку ко времени:

 Declare @Duration varchar(10)
Set @Duration = '00:01:23'
Select cast(@Duration as time)  as duration
 

или

 Declare @Duration varchar(10)
Set @Duration = '00:01:23'
Select convert(time, @Duration,8)  as duration
 

К сожалению, это не продолжительность, а время суток. Он может хранить значения только между 00:00 и 23:59:59.9999999 .

SQL Server не имеет типа интервала/продолжительности.


Комментарии:

1. Спасибо вам за вашу помощь! эти комментарии мне очень помогли!

Ответ №3:

 Declare @Duration Varchar(10) 
Set @Duration = '00:01:23'
select convert(time,@duration,8);
 

Комментарии:

1. Спасибо вам за ответ! 🙂