2012-02-14 25 views
4

"ダウン"時間値を丸めることに関する多くの記事を見つけましたが(例:https://stackoverflow.com/a/6667041/468823)、別の問題があります。より高い分に丸めたい、どのようにできるのか?SQL Server - TIME値を次の分に丸める

マイコード:

SELECT 

PA.ORE AS TOT_HOURS, 
CAST(CAST(PA.ORA_INIZIO AS DATETIME) AS TIME) AS BEGIN_TIME, 
CAST(dateadd(minute, datediff(minute, 0, (CAST(PA.ORA_INIZIO AS DATETIME))), 0) AS TIME) AS BEGIN_TIME_ROUNDED 


FROM PRG_ATTIVITA PA INNER JOIN PRG_TIPI_ATTIVITA PTA ON PA.ID_TIPO_ATTIVITA = PTA.ID_TIPO_ATTIVITA 
        INNER JOIN PER_ANAGRAFICA PAN ON PA.ID_DIPENDENTE = PAN.ID_DIPENDENTE 
WHERE PA.ID_PROGETTO = 1431 and pta.DESCR_TIPO_ATTIVITA like 'F-%remoto%' and ID_ATTIVITA = 41772 

ORDER BY PA.DATA_ATTIVITA 

私の結果は以下の通りです:

TOT_HOURS BEGIN_TIME   BEGIN_TIME_ROUNDED 
    1.50  15:59:59.9970000 15:59:00.0000000 

私は= 16 BEGIN_TIME_ROUNDEDたい:00:00.0000000

注:私は変換する必要があり 1を私のデータ{キャスト(PA.ORA_INIZIO AS DATETIME)}データベースに浮動小数点値として時刻データがあるので 2。 BEGIN_TIMEは、変換後の私の時間値の実際の値です

答えて

3
SELECT DATEADD(MINUTE, CEILING(DATEDIFF(SECOND, 0, CAST(CAST(PA.ORA_INIZIO AS DATETIME) AS TIME))/60.0), DATEDIFF(DAY, 0, PA.ORA_INIZIO)) AS BEGIN_TIME_ROUNDED 
+0

非常に良い!どうもありがとう! –

1

SQL Serverをよく理解していませんが、これを行うより事実上の方法がない場合は、追加するだけです丸め前の値に1分。整数の入力値を正しく処理する必要がある場合は、0.999分を追加してください。

3

だけのCASTは最も近い分に丸めSMALLDATETIMEする

SELECT 
    CAST(CAST('15:59:59.9970000' AS time) AS smalldatetime), 
    CAST(CAST('15:59:30.0030000' AS time) AS smalldatetime), 
    CAST(CAST('15:59:30.0000000' AS time) AS smalldatetime), 
    CAST(CAST('15:59:29.9970000' AS time) AS smalldatetime), 
    CAST(CAST('15:59:00.0030000' AS time) AS smalldatetime) 

DATEADD/DATEDIFFは、いくつかの時間単位

編集を切り捨てるためである、ちょうどあなたの現在のCASTを変更する質問

を読み違え

CAST(
DATEADD(minute, 
     DATEDIFF(minute, 
        0, 
        CAST(PA.ORA_INIZIO AS DATETIME) 
       ) + 1, 
     0 
     ) 
    AS TIME) 
+2

を-1これは、すべての質問に答えていません。営業担当者は常に最も近い分に切り上げたいので、投稿したソリューションは通常、最も近い分、つまりSELECTステートメントの最後の2つの列に丸められます(16:00までではなく15:59に切り捨てられます)。 – GarethD

+0

@GarethD:それを修正しました。私はそれを逃しました。ありがとう – gbn

+0

問題があります'20:30 'は'20:31'に切り上げられます –

0

DATETIME dを丸めたい場合最も近い分に、あなたがこれを行うことができます:

CONVERT(DATETIME, CONVERT(SMALLDATETIME, 
    DATEADD(minute, CASE WHEN d = CONVERT(SMALLDATETIME, d) THEN 0 ELSE 1 END, 
    d))) 
1
declare @t time 
set @t = '10:28:00.001' 
select cast(dateadd(millisecond, 29999, @t) as smalldatetime) 
関連する問題