SQL Server - округляет значения ВРЕМЕНИ до следующей минуты - PullRequest
4 голосов
/ 14 февраля 2012

Я нашел много сообщений о округлении «вниз» значений времени (например, 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. Я должен преобразовать свои данные {CAST (PA.ORA_INIZIO AS DATETIME)}, потому что в базе данных у меня есть данные времени в виде значений с плавающей запятой 2. BEGIN_TIME - это реальное значение моего времени после преобразования

Ответы [ 5 ]

3 голосов
/ 14 февраля 2012
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
3 голосов
/ 14 февраля 2012

Просто 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)
1 голос
/ 14 февраля 2012
declare @t time 
set @t = '10:28:00.001'
select cast(dateadd(millisecond, 29999, @t) as smalldatetime)
1 голос
/ 14 февраля 2012

Не знаю достаточно хорошо SQL Server, чтобы ответить от руки, но если никто не придумает более де-факто способ сделать это, то вы можете просто добавить 1 минуту к значению, прежде чем округлять его.Или добавьте 0,999 минут, если вам нужно правильно обрабатывать целочисленные входные значения.

0 голосов
/ 14 февраля 2012

Если вы хотите округлить DATETIME d до ближайшей минуты, вы можете сделать это:

CONVERT(DATETIME, CONVERT(SMALLDATETIME,
  DATEADD(minute, CASE WHEN d = CONVERT(SMALLDATETIME, d) THEN 0 ELSE 1 END,
  d)))
...