Sql 查询以查找特定时间段之间的记录

Sql 查询以查找特定时间段之间的记录,sql,sql-server,Sql,Sql Server,我正在尝试编写一个SQL查询来获取特定时间段之间的数据。我想选择2019-11-01至2019-12-01期间每天23:00至03:00之间的数据 我写了一个如下的问题 SELECT DATEPART(DAY, EnteredDate) AS PerDate, COUNT(Item) AS ItemCount, ItemCategory FROM MyTable WHERE EnteredDate BETWEEN '2019-11-01' AND '

我正在尝试编写一个SQL查询来获取特定时间段之间的数据。我想选择2019-11-01至2019-12-01期间每天23:00至03:00之间的数据

我写了一个如下的问题

SELECT 
    DATEPART(DAY, EnteredDate) AS PerDate,
    COUNT(Item) AS ItemCount,
    ItemCategory
FROM 
    MyTable
WHERE 
    EnteredDate BETWEEN '2019-11-01' AND '2012-12-01' AND 
    CAST(EnteredDate AS TIME) BETWEEN '23:00:00' and '03:00:00'
GROUP BY 
    DATEPART(EnteredDate), ItemCategory
ORDER BY 
    DATEPART(DAY, EnteredDate)

有谁能帮我查询一下,我可以用一下吗?

我不确定这是否是你想要的,因为没有示例数据,但如果有问题,请发表评论

SELECT DATEPART(DAY, EnteredDate) AS PerDate
       , COUNT(Item) AS ItemCount
       , ItemCategory 
FROM MyTable 
WHERE EnteredDate BETWEEN '2019-11-01' AND '2019-12-01' 
AND  (DATEPART(HOUR, EnteredDate) in (23, 00, 01, 02)
or CAST(EnteredDate AS TIME) BETWEEN '00:00:01' and '03:00:00')
GROUP BY DATEPART(Day, EnteredDate)
         , ItemCategory
ORDER BY DATEPART(DAY, EnteredDate) ;
这是一个

我不知道OP想要什么,我想再猜一次:

SELECT cast(EnteredDate as date)
       , ItemCategory 
       ,COUNT(Item) AS ItemCount
FROM MyTable 
WHERE EnteredDate BETWEEN '2019-11-01' AND '2019-12-01' 
AND  (DATEPART(HOUR, EnteredDate) in (23, 00, 01, 02)
or CAST(EnteredDate AS TIME) BETWEEN '00:00:01' and '03:00:00')
GROUP BY cast(EnteredDate as date)
         , ItemCategory
ORDER BY cast(EnteredDate as date)
         , ItemCategory;

以下是

我不确定这是否是您想要的,因为没有示例数据,但如果出现问题,请发表评论

SELECT DATEPART(DAY, EnteredDate) AS PerDate
       , COUNT(Item) AS ItemCount
       , ItemCategory 
FROM MyTable 
WHERE EnteredDate BETWEEN '2019-11-01' AND '2019-12-01' 
AND  (DATEPART(HOUR, EnteredDate) in (23, 00, 01, 02)
or CAST(EnteredDate AS TIME) BETWEEN '00:00:01' and '03:00:00')
GROUP BY DATEPART(Day, EnteredDate)
         , ItemCategory
ORDER BY DATEPART(DAY, EnteredDate) ;
这是一个

我不知道OP想要什么,我想再猜一次:

SELECT cast(EnteredDate as date)
       , ItemCategory 
       ,COUNT(Item) AS ItemCount
FROM MyTable 
WHERE EnteredDate BETWEEN '2019-11-01' AND '2019-12-01' 
AND  (DATEPART(HOUR, EnteredDate) in (23, 00, 01, 02)
or CAST(EnteredDate AS TIME) BETWEEN '00:00:01' and '03:00:00')
GROUP BY cast(EnteredDate as date)
         , ItemCategory
ORDER BY cast(EnteredDate as date)
         , ItemCategory;

这是我的建议,我相信这会对你有所帮助

SELECT 
    DATEPART(DAY, EnteredDate) AS PerDate,
    COUNT(Item) AS ItemCount,
    ItemCategory
FROM 
    MyTable
WHERE 
    CONVERT(DATE,EnteredDate) BETWEEN '2019-11-01' AND '2012-12-01' AND 
    CAST(EnteredDate AS TIME) BETWEEN '23:00:00' and '03:00:00'
GROUP BY 
    DATEPART(DAY, EnteredDate) , ItemCategory
ORDER BY 
    DATEPART(DAY, EnteredDate)

我相信这会对你有所帮助

SELECT 
    DATEPART(DAY, EnteredDate) AS PerDate,
    COUNT(Item) AS ItemCount,
    ItemCategory
FROM 
    MyTable
WHERE 
    CONVERT(DATE,EnteredDate) BETWEEN '2019-11-01' AND '2012-12-01' AND 
    CAST(EnteredDate AS TIME) BETWEEN '23:00:00' and '03:00:00'
GROUP BY 
    DATEPART(DAY, EnteredDate) , ItemCategory
ORDER BY 
    DATEPART(DAY, EnteredDate)

你有超过午夜的时间。我想你想保持“轮班制”,所以从晚上11点开始的时间被分配到第二天

如果是,则添加一小时,并将其用于逻辑:

SELECT DATEPART(DAY, v.effective_date) AS PerDate,
       COUNT(*) AS ItemCount,
       ItemCategory
FROM MyTable t CROSS APPLY
     (VALUES (DATEADD(hour, 1, t.EnteredDate))) v(effective_date)
WHERE v.effective_date >= '2019-11-01' AND
      v.effective_date < '2012-12-01' AND 
      CAST(EnteredDate AS TIME) NOT BETWEEN '03:00:00' and '23:00:00'
GROUP BY DATEPART(DAY, v.effective_date), ItemCategory
ORDER BY DATEPART(DAY, v.effective_date), ItemCategory
选择日期部分(日期,v.effect_date)作为PerDate,
计数(*)为ItemCount,
项目类别
从MyTable t交叉应用
(值(DATEADD(小时,1,t.输入日期))v(生效日期)
其中v.生效日期>='2019-11-01'和
v、 生效日期<'2012-12-01'和
演员阵容(输入时间)不在“03:00:00”和“23:00:00”之间
按日期分组部分(日期,v.生效日期),项目类别
按日期排序部分(日期,v.生效日期),项目类别

您的时间超过了午夜。我想你想保持“轮班制”,所以从晚上11点开始的时间被分配到第二天

如果是,则添加一小时,并将其用于逻辑:

SELECT DATEPART(DAY, v.effective_date) AS PerDate,
       COUNT(*) AS ItemCount,
       ItemCategory
FROM MyTable t CROSS APPLY
     (VALUES (DATEADD(hour, 1, t.EnteredDate))) v(effective_date)
WHERE v.effective_date >= '2019-11-01' AND
      v.effective_date < '2012-12-01' AND 
      CAST(EnteredDate AS TIME) NOT BETWEEN '03:00:00' and '23:00:00'
GROUP BY DATEPART(DAY, v.effective_date), ItemCategory
ORDER BY DATEPART(DAY, v.effective_date), ItemCategory
选择日期部分(日期,v.effect_date)作为PerDate,
计数(*)为ItemCount,
项目类别
从MyTable t交叉应用
(值(DATEADD(小时,1,t.输入日期))v(生效日期)
其中v.生效日期>='2019-11-01'和
v、 生效日期<'2012-12-01'和
演员阵容(输入时间)不在“03:00:00”和“23:00:00”之间
按日期分组部分(日期,v.生效日期),项目类别
按日期排序部分(日期,v.生效日期),项目类别


Hi@UDAYA,请与我们共享输入日期列的数据类型?谢谢EnteredDate[datetime]亲爱的@UDAYA这里有一个演示:用数据填充这个演示(将数据插入演示表)。然后转到您的问题,单击编辑并在问题中插入演示和演示结果。根据你提供的信息,我下面的答案是我能做的最好的。你好@UDAYA,如果你能对你所得到的帮助做出评论,那将是一件好事。人们会花一些时间来帮助你,这是你至少能做的。此外,除了评论之外,如果某个答案对你有任何帮助,你可以投赞成票,如果答案正确,你可以接受。如果你不知道如何提问。嗨@VBoka,我真的很抱歉延迟回复我收到的答案。你给了我很大的支持。非常感谢你的帮助!Hi@UDAYA,请与我们共享输入日期列的数据类型?谢谢EnteredDate[datetime]亲爱的@UDAYA这里有一个演示:用数据填充这个演示(将数据插入演示表)。然后转到您的问题,单击编辑并在问题中插入演示和演示结果。根据你提供的信息,我下面的答案是我能做的最好的。你好@UDAYA,如果你能对你所得到的帮助做出评论,那将是一件好事。人们会花一些时间来帮助你,这是你至少能做的。此外,除了评论之外,如果某个答案对你有任何帮助,你可以投赞成票,如果答案正确,你可以接受。如果你不知道如何提问。嗨@VBoka,我真的很抱歉延迟回复我收到的答案。你给了我很大的支持。非常感谢你的帮助!您好,这应该可以解决第一个问题,但您将错过大于23:59:59和小于00:00:01的时间。那么“2019年4月11日00:00:00.500”呢?您好@cabbagetreecustard,同样,您是正确的。。。再次更新…这很好,我会将OR子句的第二部分更新为等于03:00:00,但不会返回错误的结果。@UDAYA我又更新了一次我的答案…希望是这样…嗨,这应该可以解决第一个问题,但您将错过大于23:59:59和小于00:00:01的时间。那么“2019年4月11日00:00:00.500”呢?您好@cabbagetreecustard,同样,您是正确的。。。再次更新它…这很好,我会将OR子句的第二部分更新为03:00:00,但不会返回错误的结果。@UDAYA我已经更新了我的答案一次…希望是这样…这不会返回任何内容。您好@Mahesh,这不会返回任何内容。谢谢你。这不会退回任何东西。嗨@Mahesh,这不会退回任何东西。谢谢。嗨@GordonLinoff,这部分代码中的v和开括号有问题:
(值(DATEADD(hour,1,t.EnteredDate))v(effective_date)
嗨@GordonLinoff,谢谢。嗨@GordonLinoff,这部分代码中的v和开括号有问题:
(值(DATEADD(1小时,输入日期)v(生效日期)
Hi@GordonLinoff,谢谢。