SQL - 如何忽略DateTime数据类型中的秒和舍入分钟

时间:2014-03-28 13:06:06

标签: sql sql-server datetime

在工作中,我们做了一个项目,要求团队在特定时间段内每天8次对学生进行8次计算。它们如下: -

09:00, 10:00, 11:00, 13:15, 14:15, 14:50, 15:50, 16:20.

现在,收集的数据通过网络应用程序直接放入数据库。问题是数据库使用标准YYYY-MM-DD HH:MM:SS.MIL记录每条记录,但如果我按日期订购记录然后按学生计数,则会导致以下问题; e.g: -

如果在09:00:12计算一个房间里的学生是5,但是另一个房间在09:02:20计数为0,我做了以下事情:

select student_count, audit_date
from table_name
order by audit_date, student_count;

查询将返回:

5 09:00:12
0 09:02:20

但我想:

0 09:00:00
5 09:00:00

因为我们正在寻找09:00期间每个房间的学生人数,但不幸的是收集了他们要求我们在那个小时内完成的数据,显然数据库会接受这个准确性。此外,当这个问题到达时间14:15和14:50时,这个问题变得更加棘手,我们需要能够区分这两个时期。

有没有办法忽略DateTime的秒部分,并将分钟数缩小到最接近的十分钟?

我正在使用SQL Server Management Studio 2012.如果这一切都没有意义,我很抱歉!

4 个答案:

答案 0 :(得分:1)

您可能需要某种Period表来存储您的细分。然后你可以用它来加入你的计数表。

CREATE TABLE [Periods]
( -- maybe [id] INT,
    [start_time] TIME,
    [end_time] TIME
);

INSERT INTO [Periods]
VALUES  ('09:00','10:00'),
        ('10:00','11:00'),
        ('11:00','13:15'),
        ('13:15','14:15'),
        ('14:15','14:50'),
        ('14:50','15:50'),
        ('15:50','16:20'),
        ('16:20','17:00')

SELECT
    student_count, [start_time]
FROM table_name A
INNER JOIN [Periods] B
ON      CAST(A.[audit_date] AS TIME) >= B.[start_time]
    AND CAST(A.[audit_date] AS TIME) < B.[end_time]

答案 1 :(得分:0)

您可以使用DATEADDDATEPART函数与CASE表达式一起完成此操作。如果您希望在.14.50期间之间获得更精确的截止值,则可以轻松调整大小写陈述,如果您希望分钟为.10.15

-- some test data
declare @t table (the_time time)
insert @t values ('09:00:12')
insert @t values ('14:16:12')
insert @t values ('09:02:12')
insert @t values ('14:22:12')
insert @t values ('15:49:12')
insert @t values ('15:50:08')

select 
    the_time, 
    case 
        when datepart(minute,the_time) < 15 then 
            dateadd(second, -datepart(second,the_time),dateadd(minute, -datepart(minute,the_time),the_time)) 
        when datepart(minute,the_time) >= 15 and datepart(minute,the_time) < 50 then 
            dateadd(second, -datepart(second,the_time),dateadd(minute, -datepart(minute,the_time)+10,the_time)) 
        else
            dateadd(second, -datepart(second,the_time),dateadd(minute, -datepart(minute,the_time)+50,the_time)) 
    end as WithoutSeconds
from @t

结果:

the_time         WithoutSeconds
---------------- ----------------
09:00:12.0000000 09:00:00.0000000
14:16:12.0000000 14:10:00.0000000
09:02:12.0000000 09:00:00.0000000
14:22:12.0000000 14:10:00.0000000
15:49:12.0000000 15:10:00.0000000
15:50:08.0000000 15:50:00.0000000

答案 2 :(得分:0)

试试这个:

SELECT
    CAST(
        DATEADD(SECOND, - (CONVERT(INT, RIGHT(CONVERT(CHAR(2),
        DATEPART(MINUTE, GETDATE())),1))*60) - (DATEPART(SECOND,GETDATE())), GETDATE())
        AS SMALLDATETIME);

答案 3 :(得分:0)

您可以尝试按此公式订购

DATEADD(minute, floor((DATEDIFF(minute, '20000101', audit_date) + 5)/10)*10, '20000101')

e.g。

WITH tbl AS(
  SELECT * FROM ( VALUES (5,'2014-03-28 09:00:09.793'),(0,'2014-03-28 09:02:20.123')) a (student_count, audit_date)
)
SELECT  *,DATEADD(minute, floor((DATEDIFF(minute, '20000101', audit_date) + 5)/10)*10, '20000101') as ORDER_DT
FROM    tbl
ORDER BY ORDER_DT,student_count

SQL Fiddle