2016-04-27 13 views
-3

説明するのは難しいビットが、私はしようとします。 私はHHのような値のカップルを持っています: 11時591/2 2/3 3/4と4分の1/4分のSQLをsql

MM 48:12 56:52私は割合で閉じ四半期の値を取得する必要があります。

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

以下は私のクエリでのSQL Serverで、それは可能です。合計時間はvarcharです

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

私はCTEを使用できません。私は関数を作成することはできません。選択クエリを実行する必要があります。

+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は使用できません。選択クエリで実行する必要があります – maxspan

+0

@maxspan * CTEの問題は何ですか? – Shnugo

+1

両方の部分が常に2桁であることを確認できますか?常にゼロを導いていますか? – 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

を確認してください。私はHH:MMだけが必要です。 – maxspan

+0

秒を削除できますか?私はちょうど時間と分を必要としません。 – maxspan

+0

私はそれが必要でない時間から秒を削除することは可能ですか? – maxspan

1

この、何のCTE、ない機能は、ちょうど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

私は敬意を表し、Timeにキャスト" 48:12 " 「時間」は23:59です。 –

+0

私はそれを四捨五入しています – maxspan

関連する問題