2012-06-19 6 views
2

У меня есть хранимая процедура, которая обновляет таблицу на основе такого расчета, а расчет производится как имя столбца (Calendatedate) - (Current System Date Time) и обновляет это информацию в колонку (TimeSpent) и отобразить значение в формате Hh:Mm:SS:Msec.HH: MM: SS: Msec to HH: MM: SS в хранимой процедуре

Запрос работает нормально, но я хочу обновить его таким образом, чтобы потраченное время должно быть только HH:MM:SS. Пожалуйста, помогите мне, как я удалю это Msec с потраченного времени.

CREATE procedure St_Proc_UpdateTimeSpent   
@timeEntryID int,   
@status int output   
as begin   
set nocount on;   
declare @Date dateTime;   
set @Date=GETDATE(); 
    update Production set TimeSpent=(SELECT CONVERT(VARCHAR(20),DateAdd(SS,Datediff(ss,CalendarDate, @Date)%(60*60*24),0),114)), 
    IsTaskCompleted=1  
    where [email protected]   
    set @status=1;   
    return @status;   
end 
+3

Добро пожаловать в StackOverflow: если вы отправляете код, XML или образцы данных **, пожалуйста ** выделите эти строки в текстовом редакторе и нажмите кнопку «образцы кода» ('{}') на панели инструментов редактора, чтобы приятно формат и синтаксис выделить его! –

+0

Не хватит ли вам сделать 'CONVERT (VARCHAR (8), ....)' вместо 'CONVERT (VARCHAR (20) ...'? – Lamak

+0

Какой тип данных 'TimeSpent'? это 'VARCHAR()', почему вы не используете 'DATETIME'? Если вы используете' DATETIME', вы не пытаетесь установить форматирование в таблице * (A 'DATETIME' не имеет формат, это двоичный тип) *, вместо этого вы устанавливаете форматирование, когда вы выбираете значения из таблицы (или, что еще лучше, в вашем уровне представления), путем преобразования значения в строку и выбора формата в этот момент времени – MatBailie

ответ

2

Вы можете просто использовать стиль 108 вместо 114 в функции CONVERT получить только hh:mm:ss:

CREATE PROCEDURE dbo.St_Proc_UpdateTimeSpent   
    @timeEntryID int,   
    @status int output   
AS BEGIN 
    SET NOCOUNT ON; 

    DECLARE @Date DATETIME; 
    SET @Date = GETDATE(); 

    UPDATE dbo.Production 
    SET TimeSpent = CONVERT(VARCHAR(20), DATEADD(SS, DATEDIFF(ss, CalendarDate, @Date)%(60*60*24),0), 108), 
     IsTaskCompleted = 1 
    WHERE 
     productionTimeEntryID = @timeEntryID   

    SET @status = 1; 

    RETURN @status;   
END 

Смотрите excellent MSDN documentation on CAST and CONVERT для полного списка всех поддерживаемых типов при преобразовании DATETIME в VARCHAR (и обратно)

BTW: SQL Server 2008 также представил TIME datatype, который, вероятно, был бы лучше, чем VARCHAR для хранения ваших значений TimeSpent ... проверьте это!

+0

Вы считаете, что 'TimeSpent' является' VARCHAR() '. Я видел, как люди используют' CAST/CONVERT', чтобы попытаться отформатировать содержимое поля DATETIME далеко не всегда, чтобы доверять этому предположению;) – MatBailie

+0

@Dems: да, я предполагаю 'VARCHAR', так как это целевой тип вызова CONVERT, а OP говорит о конкретном« формате »(что действительно имеет смысл с помощью VARC HAR') - но вы правы, это на самом деле ничего не значит, я знаю :-) –

Смежные вопросы