2012-02-14 57 views
4

我發現了很多關於舍入「down」時間值的帖子(例如https://stackoverflow.com/a/6667041/468823),但我還有另一個問題:我想繞到較高的分鐘而不是較低的分鐘,我能怎麼做?SQL Server - Round 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 

我想BEGIN_TIME_ROUNDED = 16:00:00.0000000

注:1。 我必須轉換我的數據{CAST(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

非常好!非常感謝! – 2012-02-14 09:54:02

1

不知道SQL Server是否足夠應付,但如果沒有人以更實際的方式來做這件事,那麼您可以添加在將其舍入之前1分鐘。或者,如果您還需要正確處理整數輸入值,請添加0.999分鐘。

3

只投爲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這不回答這個問題的。 OP要總是四捨五入到最接近的分鐘,您發佈的解決方案通常會輪到最接近的分鐘,即選擇語句的最後2列舍入到15:59而不是16:00。 – GarethD 2012-02-14 09:42:04

+0

@GarethD:修好了,我錯過了。謝謝 – gbn 2012-02-14 09:46:33

+0

有一個問題'20:30'會四捨五入到'20:31' – 2012-02-15 08:45:40

0

如果您想將DATETIME d up到最近分鐘,你可以這樣做:

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)