【发布时间】:2014-07-07 11:12:54
【问题描述】:
我正在致力于在我的 Web 应用程序中自动化 SMS 发送部分。
DurationType 表存储是否应按小时、天、周、月的间隔发送短信。在 SMSConfiguration 中引用
CREATE TABLE [dbo].[DurationType](
[Id] [int] NOT NULL PRIMARY KEY,
[DurationType] VARCHAR(10) NOT NULL
)
Bookings 表 包含原始 Bookings 数据。对于此预订,我需要根据配置发送 SMS。
短信配置。其中定义了发送自动 SMS 的配置。它可以在之前/之后发送。之前=0,之后=1。 DurationType can be Hours=1, Days=2, Weeks=3, Months=4
现在我需要根据短信配置集找出当前需要发送短信的预订列表。
尝试使用 UNION 的 SQL
DECLARE @currentTime smalldatetime = '2014-07-12 11:15:00'
-- 'SMS CONFIGURED FOR HOURS BASIS'
SELECT B.Id AS BookingId,
B.StartTime AS BookingStartTime,@currentTime As CurrentTime, SMS.SMSText
FROM Bookings B INNER JOIN
SMSConfiguration SMS ON SMS.CategoryId = B.CategoryId OR SMS.CategoryId IS NULL
WHERE (DATEDIFF(HOUR, @currentTime, B.StartTime) = SMS.Duration AND SMS.DurationType=1 AND BeforeAfter=0)
OR
(DATEDIFF(HOUR, B.StartTime, @currentTime) = SMS.Duration AND SMS.DurationType=1 AND BeforeAfter=1)
--'SMS CONFIGURED FOR DAYS BASIS'
UNION
SELECT B.Id AS BookingId,
B.StartTime AS BookingStartTime,@currentTime As CurrentTime, SMS.SMSText
FROM Bookings B INNER JOIN
SMSConfiguration SMS ON SMS.CategoryId = B.CategoryId OR SMS.CategoryId IS NULL
WHERE (DATEDIFF(DAY, @currentTime, B.StartTime) = SMS.Duration AND SMS.DurationType=2 AND BeforeAfter=0)
OR
(DATEDIFF(DAY, B.StartTime, @currentTime) = SMS.Duration AND SMS.DurationType=2 AND BeforeAfter=1)
--'SMS CONFIGURED FOR WEEKS BASIS'
UNION
SELECT B.Id AS BookingId,
B.StartTime AS BookingStartTime, @currentTime As CurrentTime, SMS.SMSText
FROM Bookings B INNER JOIN
SMSConfiguration SMS ON SMS.CategoryId = B.CategoryId OR SMS.CategoryId IS NULL
WHERE (DATEDIFF(DAY, @currentTime, B.StartTime)/7 = SMS.Duration AND SMS.DurationType=3 AND BeforeAfter=0)
OR
(DATEDIFF(DAY, B.StartTime, @currentTime)/7 = SMS.Duration AND SMS.DurationType=3 AND BeforeAfter=1)
--'SMS CONFIGURED FOR MONTHS BASIS'
UNION
SELECT B.Id AS BookingId,
B.StartTime AS BookingStartTime, @currentTime As CurrentTime, SMS.SMSText
FROM Bookings B INNER JOIN
SMSConfiguration SMS ON SMS.CategoryId = B.CategoryId OR SMS.CategoryId IS NULL
WHERE (dbo.FullMonthsSeparation(@currentTime, B.StartTime) = SMS.Duration AND SMS.DurationType=4 AND BeforeAfter=0)
OR
(dbo.FullMonthsSeparation(B.StartTime, @currentTime) = SMS.Duration AND SMS.DurationType=4 AND BeforeAfter=1)
结果
问题:
SQL 过程将每 15 分钟运行一次。当前查询即使在当前时间“2014-07-12 11:30:00”、“2014-07-12 11:45:00”等时也会继续返回天/周/月记录
我想要一个处理所有小时/天/周/月的查询 计算,我应该只在他们相遇时得到一次记录 正确的时间。否则我会一次又一次地发送短信 每 15 分钟匹配日/周/月记录。
应该考虑以下场景。
小时,如果预订是同一天上午 10:15,如果在配置的 1 小时之前,则为上午 9:15
天(24 小时差),如果预订是 10:15 A.M 第三天早上 10:15 A.M 如果在 SMSConfiguration 中配置 3 天后
比赛周。如果预订时间是今天(星期三)上午 10:15,那么 14 天后的上午 10:15(如果配置为 2 周后)。
月份也和上面一样。
【问题讨论】:
-
在给定的小提琴链接中,我删除了终止字符 (
;) ,将错误的别名(S 更改为 SMS)和交换 DATEDIFF 中的日期。效果很好
标签: sql sql-server sql-server-2008-r2 datediff