Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-如何在DateTime数据类型中忽略秒并向下取整分钟_Sql_Sql Server_Datetime - Fatal编程技术网

SQL-如何在DateTime数据类型中忽略秒并向下取整分钟

SQL-如何在DateTime数据类型中忽略秒并向下取整分钟,sql,sql-server,datetime,Sql,Sql Server,Datetime,在工作中,我们做了一个项目,要求一个团队在5天的特定时间段内每天对学生进行8次计数。它们是: 09:00, 10:00, 11:00, 13:15, 14:15, 14:50, 15:50, 16:20. 现在,收集的数据通过一个web应用程序直接存入数据库。问题是数据库使用标准YYYY-MM-DD HH:MM:SS.MIL记录了每条记录,但如果我按日期然后按学生人数排序记录,则会导致以下问题; e、 g:- 如果一个房间的学生在09:00:12时数为5,而另一个房间在09:02:20时数为0

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

09:00, 10:00, 11:00, 13:15, 14:15, 14:50, 15:50, 16:20.
现在,收集的数据通过一个web应用程序直接存入数据库。问题是数据库使用标准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的秒数部分,将分钟数舍入到最接近的十分钟

我正在使用SQLServerManagementStudio 2012。如果这些都没有意义,我很抱歉

您可以使用DateAdd和DatePart函数与CASEexpression一起完成此操作。如果您希望在.14和.50时段之间有更精确的截止时间,您可以轻松地调整case语句,也可以将分钟数调整为.10或.15

试试这个:

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

您可能需要某种时段表来存储段。然后您可以使用它连接到计数表

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]

你可以试着用这个公式点餐

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


为此,我不得不做一些更改,因为实际的数据库是SQLServer2005,因此时间数据类型不存在;最后在[start_time]列中使用了DATEPART
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]
DATEADD(minute, floor((DATEDIFF(minute, '20000101', audit_date) + 5)/10)*10, '20000101')
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