2016-04-27 3 views
-3

Его немного сложно объяснить, но я попробую. Я имею пару значений, как в HH: MM 48:12 56:52 11:59Как получить 1/4 2/4 3/4 и 4/4 минуты в ms sql

Мне нужно, чтобы получить замкнутое значение четверти в процентах.

48.12 Should be 48.25 
56.52 Should be 52.75 
11:59 Should be 12:00 

Можно ли в SQL сервере

Ниже мой запрос. TotalTime является VARCHAR

SELECT (datediff(second, 0, TotalTime)/(60.0 * 60.0)) 

Я не могу использовать СТ. Я не могу создать функцию. Необходимо выполнить выбор запроса.

+1

Какой тип данных? –

+0

Тип данных - varchar. Я обновил свой вопрос – maxspan

+0

Тип данных «TotalTime» - «VARCHAR»? –

ответ

1

Это можно сделать. Функция взята из других сообщений здесь относительно временного округления

CREATE FUNCTION [dbo].[RoundTime] (@Time datetime, @RoundTo float) 
RETURNS datetime 
AS 
BEGIN 
    DECLARE @RoundedTime smalldatetime 
    DECLARE @Multiplier float 

    SET @Multiplier= 24.0/@RoundTo 

    SET @RoundedTime= ROUND(CAST(CAST(CONVERT(varchar,@Time,121) AS datetime) AS float) * @Multiplier,0)/@Multiplier 

    RETURN @RoundedTime 
END 

DECLARE @A VARCHAR(5) 

SELECT @A = CONVERT(CHAR(5),CAST(dbo.roundtime('13:14',0.25) AS TIME),108) 


select LEFT(@A,2) + '.' + CAST(CAST(SUBSTRING(@A,4,2) AS FLOAT)/60 * 100 AS CHAR(2)) 
+0

Я не могу создать функцию. Необходимо выполнить выбор запроса. – maxspan

+0

@maxspan Это становится смешным ... Вы можете использовать функцию * внутри *, как выбрать запрос ... – Shnugo

+0

Я знаю, что вы можете использовать функцию, но мне не разрешено создавать функцию. – maxspan

0

Замените cte на название таблицы. Нечто подобное я полагаю:

;WITH cte AS (
SELECT * 
FROM (VALUES 
('48:12'), 
('45:30'), 
('56:52'), 
('11:59'), 
('11:00') 
) as t(v) 
) 

SELECT CASE WHEN CAST(RIGHT(c.v,2) as int) between 46 and 59 THEN CAST((CAST(LEFT(c.v,2) as int) + 1) as nvarchar(2)) + ':' 
      WHEN CAST(RIGHT(c.v,2) as int) = 0 THEN LEFT(c.v,2) + ':' 
      ELSE LEFT(c.v,2) + '.' END 
      + 
     CASE WHEN CAST(RIGHT(c.v,2) as int) between 1 and 15 THEN '25' 
     WHEN CAST(RIGHT(c.v,2) as int) between 16 and 30 THEN '50' 
     WHEN CAST(RIGHT(c.v,2) as int) between 31 and 45 THEN '75' 
     WHEN CAST(RIGHT(c.v,2) as int) between 46 and 59 THEN '00' 
     WHEN CAST(RIGHT(c.v,2) as int) = 0 THEN '00' END as ColumnName 
FROM cte c 

Выход:

ColumnName 
48.25 
45.50 
57:00 
12:00 
11:00 
+0

Я не могу использовать CTE.Это нужно сделать в select query – maxspan

+0

@maxspan В чем проблема с * CTE и select query *? – Shnugo

+1

Можем ли мы быть уверены, что обе части всегда состоят из двух цифр? Есть ли когда-либо ведущие нули? – Shnugo

1
DECLARE @TimeString VARCHAR(MAX) = '17:34' 
DECLARE @Time Time = CAST(@TimeString AS TIME) 
SELECT DATEPART(hour,@Time) + (DATEPART(minute,@Time)/15) * 0.25 + ROUND(CAST(DATEPART(minute,@Time) % 15 AS FLOAT)/15, 0) * 0.25 
+0

Привет Деннис Его довольно близко. Мне нужно только ЧЧ: ММ. – maxspan

+0

Можете ли вы удалить секунды. Мне не нужны секунды только час и мин. – maxspan

+0

Можно ли удалить секунды со времени, в котором я не нуждаюсь. – maxspan

1

Может быть, это, не КТР, нет функции, просто SELECT

DECLARE @tbl TABLE(funnytime VARCHAR(5)); 
INSERT INTO @tbl VALUES('48:12'),('56:52'),('11:59'); 

SELECT CAST('00:' + REPLACE(STR(FinalTbl.TheMinute,2),' ','0') + ':' + REPLACE(STR(FinalTbl.TheSecond,2),' ','0') AS TIME) TheRoundedTime 
FROM 
(
    SELECT CASE WHEN TheSecond BETWEEN 52 AND 60 THEN TheMinute+1 ELSE TheMinute END AS TheMinute 
      ,CASE WHEN TheSecond BETWEEN 0 AND 6 THEN 0 
       WHEN TheSecond BETWEEN 7 AND 21 THEN 15 
       WHEN TheSecond BETWEEN 22 AND 36 THEN 30 
       WHEN TheSecond BETWEEN 37 AND 51 THEN 45 
       ELSE 0 END TheSecond 
    FROM 
    (
     SELECT Splitted.ToXML.value('/x[1]','int') TheMinute 
       ,Splitted.ToXML.value('/x[2]','int') TheSecond 
     FROM 
     (
      SELECT CAST('<x>' + REPLACE(funnytime ,':','</x><x>') + '</x>' AS XML) ToXML 
      FROM @tbl 
     ) AS Splitted 
    ) AS TimeVals 
) AS FinalTbl 
+0

В вашем вопросе звучит так, будто вам это нужно как '.25/.30/.45'. В этом случае просто «CASE» вернет эти значения и опустит окончательный 'CAST'' 'TIME' ... – Shnugo

-1

Здесь нет ответа.

DECLARE @TotalTime varchar(max) 
SET @TotalTime = '48:12' 
    Select ROUND((DATEDIFF(MINUTE,0, CAST(@TotalTime as Time))/60.00)/25, 2) * 25 AS [Rounded Hours] 

Это даст мне 48:25 в качестве ответа.

+0

Я боюсь, что кастинг« 48:12 »во Время закончится ошибкой, так как это возможно 'Время' 23:59 –

+0

Работает для меня, когда я округляю его – maxspan

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