这对某人来说是个挑战。我正在尝试将会话时间缩短到最接近的四分之一小时(我报告了我的总客户端时间以获取许可证凭据)
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的概念。这是我应该使用的吗?我无法绕过答案)。
感激不尽,
〜杰伊
答案 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