Tsql 如何提取在一周中的每一天的不同时间之后具有发送日期的记录?

Tsql 如何提取在一周中的每一天的不同时间之后具有发送日期的记录?,tsql,Tsql,我有一个表格,里面有电子邮件数据,特别是发送日期和时间。我需要提取每天在给定时间后(即营业结束后)发送的记录。问题是每天的营业时间可能会有所不同。目前我们只在下午6点后使用,但与本周剩余时间相比,一些业务可能在周五提前完成 我可以按照以下方式进行单个查询: SELECT DataExtractTableID FROM DataExtractTable WHERE (Box = 'Sent Items') AND (Owner = @EmailAddress) AND (DateSent BET

我有一个表格,里面有电子邮件数据,特别是发送日期和时间。我需要提取每天在给定时间后(即营业结束后)发送的记录。问题是每天的营业时间可能会有所不同。目前我们只在下午6点后使用,但与本周剩余时间相比,一些业务可能在周五提前完成

我可以按照以下方式进行单个查询:

SELECT DataExtractTableID FROM DataExtractTable WHERE (Box = 'Sent Items') AND
(Owner = @EmailAddress) AND 
(DateSent BETWEEN @StartDate AND @EndDate)
AND (CAST(DateSent as time) >= CAST(@MondayCloseOfBusiness as time));
然后对一周中的每一天重复此操作,然后将所有DataExtractTableId转储到一个临时表中,以获得与每天单独时间后设置的电子邮件相关的DataExtractTableId的总列表


这一切似乎有点冗长,我想知道是否有更聪明的解决方案可以在单个查询或SP中完成?

这里有两个选项

添加一个表它也可以是一个临时表/表变量,用于耦合工作日和工作时间,然后在工作日连接到此表: 请改为使用:
请注意,这取决于区域设置-具体来说,一周的第一天可以由配置。

Zohar,感谢您的回答,我将尝试一下。我没有按照您的第二个选项使用案例陈述,因此我有兴趣了解该方法。我已编辑了我的回答,以添加到案例官方文档的链接。基本上,它是一个基于条件返回标量值的表达式。Zohar,谢谢你的帮助,我不得不删除我版本中的ELSE语句,因为我使用它的地方我只对周一到周五感兴趣,所以我需要忽略周末。我已经测试了结果,它就像一个魅力,比我一直做的方式要简单得多。谢谢你的链接。再次感谢。
SET DATEFIRST 7;
DECLARE @WorkingHours AS TABLE
(
    WeekDay int,
    OpenTime Time,
    CloseTime Time
);

INSERT INTO @WorkingHours(WeekDay, OpenTime, CloseTime) VALUES
(1, '08:00:00', '18:00:00'),
(2, '08:30:00', '18:30:00'),
(3, '09:00:00', '19:00:00'),
(4, '08:00:00', '18:00:00'),
(5, '08:00:00', '18:00:00'),
(6, '08:00:00', '12:00:00');

SELECT DataExtractTableID 
FROM DataExtractTable 
JOIN @WorkingHours AS WH
    ON DATEPART(WEEKDAY, DataExtractTable.DateSent) = WH.WeekDay
WHERE (Box = 'Sent Items') 
AND Owner = @EmailAddress 
AND DateSent BETWEEN @StartDate AND @EndDate
AND CAST(DateSent as time) >= WH.CloseTime;
SET DATEFIRST 7;
DECLARE @SundayClosingTime Time = '16:00:00',
@MondayClosingTime Time = '12:00:00',
@RegularClosingTime Time = '18:00:00';

SELECT DataExtractTableID 
FROM DataExtractTable 
WHERE Box = 'Sent Items'
AND Owner = @EmailAddress 
AND DateSent BETWEEN @StartDate AND @EndDate
AND CAST(DateSent as time) >= CASE DATEPART(WEEKDAY, DateSent)
    WHEN 1 THEN @SundayClosingTime 
    WHEN 2 THEN @MondayClosingTime 
    ELSE @RegularClosingTime
    END;