3

我有一个函数可以将日期时间四舍五入到最近的一刻钟。但是有没有办法四舍五入到最近的四分之一?

例子。

08:14:00 becomes 08:00:00
08:03:00 becomes 08:00:00
08:29:00 becomes 08:15:00 
08:55:00 becomes 08:45:00

这就是我现在必须四舍五入到最近的四分之一。

(
@dt datetime
)
returns datetime
as
begin
declare @result datetime
declare @mm int
set @mm=datepart(minute,@dt)
set @result = dateadd(minute,-@mm + (round(@mm/cast(15 as float),0)*15) , @dt )

return @result
4

3 回答 3

3

使用 SQL Server:

select cast( 
         FLOOR( cast( GetDate() as float)*(24*4)) / (24*4) 
       as smalldatetime) AS "datetime_quarter"

策略是:

  • 将日期转换为浮点数,*24以获取小时数,*4以获取季度数
  • 四舍五入FLOOR
  • 转换回天数/(24*4)
  • 将天数转换为日期时间。smalldatetime用于避免浮点舍入问题。

这可以很容易地调整为使用ROUNDCEILING代替;或使用其他小时倍数而不是4(季度)。

于 2012-12-06T08:53:22.817 回答
0

这是获取当前季度上限和下限的过程。

declare QUARTER_FLOOR datetime;
declare QUARTER_CEIL datetime;
declare CURRENT_DATETIME datetime;
declare CURRENT_MINUTE int;
// get current datetime without second and millisecond
SET CURRENT_DATETIME = dateformat(getdate(), 'YYYY-MM-DD hh:NN:00.000');
set CURRENT_MINUTE = datepart(minute,CURRENT_DATETIME); // get current minute
// GET CURRENT QUARTER FLOOR
set QUARTER_FLOOR = dateadd(minute, -CURRENT_MINUTE + (round(CURRENT_MINUTE/cast(15 as float),0)*15) , CURRENT_DATETIME );
// GET CURRENT QUARTER FLOOR
set QUARTER_CEIL = dateadd(minute, ((round(CURRENT_MINUTE/cast(15 as float),0)+1)*15) - CURRENT_MINUTE , CURRENT_DATETIME );

 // RETURN
select  QUARTER_FLOOR, QUARTER_CEIL;
于 2020-09-01T09:27:44.863 回答
0

当我们将月份除以 4 时,这种方法依赖于整数除法。原则上它应该是可移植的,当然要修改dateadd()/date_add()month()/的语法year()

SELECT DATEADD(
  MONTH,
  3 * (
       MONTH( my_date ) / 4
       ),
  CONCAT(
    YEAR( my_date ),
    '0101' )
  ) AS my_date_rounded_to_quarter
于 2022-03-01T22:45:00.850 回答