ien*_*ens 5 sql t-sql rounding sql-server-2008 sqldatetime
我发现了很多关于四舍五入“向下”时间值的帖子(例如/sf/answers/466692901/),但我有另一个问题:我想四舍五入到更高的分钟而不是更低的分钟,如何我可不可以做?
我的代码:
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
Run Code Online (Sandbox Code Playgroud)
我的结果如下:
TOT_HOURS BEGIN_TIME BEGIN_TIME_ROUNDED
1.50 15:59:59.9970000 15:59:00.0000000
Run Code Online (Sandbox Code Playgroud)
我想要 BEGIN_TIME_ROUNDED = 16:00:00.0000000
注意: 1. 我必须转换我的数据 { CAST(PA.ORA_INIZIO AS DATETIME) } 因为在数据库中我有时间数据作为浮点值 2. BEGIN_TIME 是转换后我的时间值的实际值
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
Run Code Online (Sandbox Code Playgroud)
编辑
正如评论中指出的,此操作会在 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);
Run Code Online (Sandbox Code Playgroud)
这使:
| 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 |