SQL Server - округляет значения ВРЕМЕНИ до следующей минуты
Я нашел много сообщений о округлении "вниз" значений времени (например, /questions/24384419/t-sql-datetime-okruglyaetsya-do-blizhajshej-minutyi-i-blizhajshih-chasov-s-ispolzovaniem-funktsij/24384438#24384438), но у меня есть еще одна проблема: я хочу округлить до более высокой минуты, а не до нижней, как я могу сделать?
Мой код:
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 ответов
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
Просто 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)
declare @t time
set @t = '10:28:00.001'
select cast(dateadd(millisecond, 29999, @t) as smalldatetime)
Не знаю достаточно хорошо SQL Server, чтобы ответить на него, но если никто не придет к более де-факто способу сделать это, то вы можете просто добавить 1 минуту к значению, прежде чем округлять его. Или добавьте 0,999 минут, если вам нужно правильно обрабатывать целочисленные входные значения.
Если вы хотите округлить DATETIME до ближайшей минуты, вы можете сделать это:
CONVERT(DATETIME, CONVERT(SMALLDATETIME,
DATEADD(minute, CASE WHEN d = CONVERT(SMALLDATETIME, d) THEN 0 ELSE 1 END,
d)))