将分钟数在8,23,38,53之间收集到最近的四分之一小时

时间:2014-03-18 20:34:59

标签: excel

这对某人来说是个挑战。我正在尝试将会话时间缩短到最接近的四分之一小时(我报告了我的总客户端时间以获取许可证凭据)

8 minutes or above: round up to 15     
23 minutes or above: round up to 30        
38 minutes or above: round up to 45      
53 minutes or above: round up to 60

例如:在第一个季度小时,低于8的分钟将是它们的确切值:1 = 1,2 = 2,3 = 3。

当输入8时,它会自动向上舍入到15(其余时间也是如此:例如:16 = 16,17 = 17,18 = 18,19 = 19,20 = 20,21 = 21,22 = 22.但是23到29都被舍入到30。

理想情况下,我可以在一列中输入小时和分钟,例如:1.54

然而,我意识到可能需要创建一个小时和分钟的单独列,以使这项工作(即,我的公式只涉及四舍五入。我可以将我的小时和分钟加在一起分钟后四舍五入。)因此:

Column A = Hours (3 hours maximum)   
Column B = Minutes  
Column C = Minutes Rounded up to nearest ¼ hour     
Column D = Col A + Col C

在B栏中,我想输入分钟为1到60(无小数 - 即一般情况下,不是时间格式)

B栏中的38分钟将在C栏中自动舍入到45分钟

有没有人有任何想法?如何使用最少的列数来完成此操作?

[A之前发布的问题 - "四舍五入到最近的一个季度" - 介绍Math.Ceiling的概念。这是我应该使用的吗?我无法绕过答案)。

感激不尽,

〜杰伊

2 个答案:

答案 0 :(得分:0)

假设“会话”是您的表格(下面的CTE包含2个样本记录),会话开始时间&存储结束时间(如上面的注释中所述,只存储这些数据点,不存储计算值)。您可能可以进行如下四舍五入。 (不确定这是否是你想要的,因为它要么向上舍入向下......你不想向下舍入吗?)

;WITH   sessions AS (
    SELECT  CAST('20140317 12:00' AS DATETIME) AS session_start, CAST('20140317 12:38' AS DATETIME) AS session_end
    UNION ALL
    SELECT  CAST('20140317 12:00' AS DATETIME), CAST('20140317 12:37:59' AS DATETIME) AS session_end
)
SELECT  *, DATEDIFF(MINUTE, session_start, session_end) AS session_time
        , ROUND(DATEDIFF(MINUTE, session_start, session_end)/15.0, 0) * 15.0 AS bill_time
FROM    sessions;

编辑:

你好杰伊,我不认为你提到这是一个Excel问题!我在假设SQL。正如Stuart在上面的评论中所建议的那样,如果你修改了你的问题以表明它是用于Excel,那将是有帮助的,以便其他人可以在将来从这个对话框获得帮助。

使用Excel,您可以使用包含会话开始日期和时间(列A)和会话结束日期和时间(列B)的两列,以及两个公式:

Column C (Actual Minutes) = ROUND((B1-A1) * 1440,0)
Column D (Billing Minutes) = (FLOOR(C1/15, 1) * 15) + IF(MOD(C1,15) >= 8, 15, MOD(C1,15))

这就是我的表格:

3/18/2014 12:00 3/18/2014 12:38 38  45
3/18/2014 14:00 3/18/2014 14:37 37  37

答案 1 :(得分:0)

这是怎么回事?

DECLARE @time DATETIME = '2014-03-19T09:59:00'

SELECT CASE 
          WHEN DATEPART(mi, @time) BETWEEN 8 AND 15 THEN DATEADD(mi, 15-DATEPART(mi, @time), @time) 
          WHEN DATEPART(mi, @time) BETWEEN 23 AND 30 THEN DATEADD(mi, 30-DATEPART(mi, @time), @time)
          WHEN DATEPART(mi, @time) BETWEEN 38 AND 45 THEN DATEADD(mi, 45-DATEPART(mi, @time), @time)
          WHEN DATEPART(mi, @time) BETWEEN 53 AND 59 THEN DATEADD(mi, 60-DATEPART(mi, @time), @time)
          ELSE @time
       END