5

「ダウン」時間値の切り捨てに関する投稿をたくさん見つけましたが(例:https ://stackoverflow.com/a/6667041/468823 )、別の問題があります。低い分ではなく、高い分に丸めたいのですが、どうすればよいですか僕にできる?

私のコード:

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。データベースに時間データがfloat値としてあるため、データを変換する必要があります{CAST(PA.ORA_INIZIO AS DATETIME)}。2。BEGIN_TIMEは、変換後の時間値の実際の値です。

4

5 に答える 5

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秒の間失敗します。これは、天井の精度を秒からミリ秒に変更するだけで対処できます。

SELECT  PA.ORA_INIZIO,
        DATEADD(MINUTE, 
            CEILING(DATEDIFF(MILLISECOND, 0, CAST(PA.ORA_INIZIO AS TIME)) / 60000.0),
            DATEDIFF(DAY, 0, PA.ORA_INIZIO)) AS BEGIN_TIME_ROUNDED
FROM (VALUES 
        (CONVERT(DATETIME, '20211126 15:59:00.997')), 
        (CONVERT(DATETIME, '20211126 15:59:00.004'))
    ) AS PA (ORA_INIZIO);

これは次のようになります。

ORA_INIZIO BEGIN_TIME_ROUNDED
2021-11-26 15:59:59.997 2021-11-26 16:00:00.000
2021-11-26 15:59:00.003 2021-11-26 16:00:00.000
于 2012-02-14T09:38:48.650 に答える
2

ちょうど最も近い分に丸めるために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(
 DATEADD(minute,
         DATEDIFF(minute, 
                  0, 
                  CAST(PA.ORA_INIZIO AS DATETIME)
                 ) + 1, 
         0
         )
     AS TIME)
于 2012-02-14T09:38:30.503 に答える
1

SQL Serverを十分に理解していないので、すぐに答えることができますが、これを行うためのより事実的な方法を誰も持っていない場合は、値に1分を足してから切り捨てることができます。または、整数の入力値も正しく処理する必要がある場合は、0.999分を追加します。

于 2012-02-14T09:34:56.107 に答える
0

DATETIME dを最も近い分に切り上げたい場合は、次のように実行できます。

CONVERT(DATETIME, CONVERT(SMALLDATETIME,
  DATEADD(minute, CASE WHEN d = CONVERT(SMALLDATETIME, d) THEN 0 ELSE 1 END,
  d)))
于 2012-02-14T09:38:42.433 に答える
0
DECLARE @ datetime = '2021-11-26 00:00:00.997'
SELECT dateadd(minute, ceiling(cast(@ as float) * 1440),0) ceilingminute
于 2012-02-14T11:41:23.463 に答える