随笔 - 234, 文章 - 12, 评论 - 1671, 阅读 - 74万
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

一个关于时间的SQL分组排序问题

Posted on   生鱼片  阅读(3644)  评论(2编辑  收藏  举报

1. 我有一张表如下:

AttTime(datetime)        Emp(nvarchar)            Dept(nvarchar)

2008-08-02 6:45               zhangsan                   A

2008-08-02 18:20             zhangsan                    A

2008-08-02 11:22             zhangsan                    A

2008-08-02 18:20             zhangsan                    A

2008-08-08 7:15               zhangsan                    A

2008-08-08 19:12             zhangsan                    A

2008-08-01 6:41              ww                              A

2008-08-01 8:41              ww                              A

2008-08-01 17:20            ww                              A

2008-08-06 7:11             ww                              A

2008-08-06 18:12           ww                              A

2008-08-04 8:13              lisi                              B

2.想要得到数据如下:

即得到指定Dept(A)下的所有Emp(zhangsan,ww)AttTime记录,并按每个人分组显示,求出每个人每天的最大时间和最小时间,

没有记录的日期用空的补全。 

AttDate      minAttTime    maxAttTime Emp Dept

2008-08-02    6:45        18:20      zhangsan  A

2008-08-03    null          null      zhangsan  A

2008-08-04    null          null      zhangsan  A

2008-08-05    null          null      zhangsan  A

2008-08-06    null          null      zhangsan  A

2008-08-07    null          null      zhangsan  A

2008-08-08    7:15          19:12    zhangsan  A

 

2008-08-01    6:41          17:20      ww      A

2008-08-02    null          null      ww      A

2008-08-03    null          null      ww      A

2008-08-04    null          null      ww      A

2008-08-05    null          null        ww      A

2008-08-06    7:11          18:12      ww      A

3.答案如下:

--> 生成测试数据: @AttRecords

CREATE TABLE AttRecords(AttTime DATETIME,Emp VARCHAR(8),Dept VARCHAR(1))

INSERT INTO AttRecords

SELECT '2008-08-02 6:45','zhangsan','A' UNION ALL

SELECT '2008-08-02 18:20','zhangsan','A' UNION ALL

SELECT '2008-08-02 11:22','zhangsan','A' UNION ALL

SELECT '2008-08-02 18:20','zhangsan','A' UNION ALL

SELECT '2008-08-08 7:15','zhangsan','A' UNION ALL

SELECT '2008-08-08 19:12','zhangsan','A' UNION ALL

SELECT '2008-08-01 6:41','ww','A' UNION ALL

SELECT '2008-08-01 8:41','ww','A' UNION ALL

SELECT '2008-08-01 17:20','ww','A' UNION ALL

SELECT '2008-08-06 7:11','ww','A' UNION ALL

SELECT '2008-08-06 18:12','ww','A' UNION ALL

SELECT '2008-08-04 8:13','lisi','B'

 

--SQL查询如下:

 

--在实际中.应该在数据库中建立一个序号表来代替master.dbo.spt_values

GO

CREATE VIEW dbo.v_Test

AS

SELECT

    A.Emp,A.Dept,

    CONVERT(VARCHAR(10),A.AttTime,120) AS AttTime,

    CONVERT(VARCHAR(10),MIN(B.AttTime),108) AS MinAttTime,

    CONVERT(VARCHAR(10),MAX(B.AttTime),108) AS MaxAttTime

FROM (SELECT A.ID,B.Dept,B.Emp,DATEADD(day,A.ID,B.MinAttTime) AS AttTime

      FROM (SELECT number AS ID FROM master.dbo.spt_values WHERE type = 'p') AS A

        CROSS JOIN (SELECT Dept,Emp,MIN(AttTime) AS MinAttTime,MAX(AttTime) AS MaxATtTime

                FROM AttRecords WHERE Dept = 'A' GROUP BY Dept,Emp ) AS B

    WHERE DATEADD(day,A.ID,B.MinAttTime) <= B.MaxAttTime) AS A

LEFT JOIN AttRecords AS B

ON DATEDIFF(day,B.AttTime,A.AttTime) = 0 AND A.Emp = B.Emp AND A.Dept = B.Dept

GROUP BY A.Dept,A.Emp,CONVERT(VARCHAR(10),A.AttTime,120);

GO

 

SELECT * FROM dbo.v_Test ORDER BY Dept,Emp,AttTime;

 

GO

DROP VIEW dbo.v_Test;

DROP TABLE AttRecords;

问下这个查询如果用linqtosql直接对AttRecords查询如何才能得到我想要的数据呢?

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
点击右上角即可分享
微信分享提示