我有一个问题,我有点困惑。基本上,我有一个包含4列的表,一列是日期,返回的结果取决于一天中的时间。如果时间是在下午6点之前,则按原样返回数据,但如果在6之后,则找到下一个可用日期。
这是一些假设今天是2014-07-10的样本数据:
+----------+---------------------+-----------------+----------------+
| Workzone | ScheduleDate | NextDayDelivery | StdDayDelivery |
+----------+---------------------+-----------------+----------------+
| SWANS | 2014-07-11 00:00:00 | 1 | 1 |
| SWANS | 2014-07-12 00:00:00 | 0 | 1 |
| SWANS | 2014-07-13 00:00:00 | 0 | 0 |
| SWANS | 2014-07-14 00:00:00 | 0 | 1 |
| SWANS | 2014-07-15 00:00:00 | 0 | 1 |
| SWANS | 2014-07-16 00:00:00 | 0 | 1 |
| SWANS | 2014-07-17 00:00:00 | 0 | 1 |
| SWANS | 2014-07-18 00:00:00 | 0 | 1 |
| SWANS | 2014-07-19 00:00:00 | 0 | 1 |
| SWANS | 2014-07-20 00:00:00 | 0 | 0 |
+----------+---------------------+-----------------+----------------+
这是到目前为止的查询:
DECLARE @hour AS Int
SET @hour = DatePart(hour, getdate())
SET @hour = 19
-- Work out if the time is before 18:00. If it is then this is the easy bit, use the data as is.
IF (@hour <= 18)
BEGIN
SELECT
[Workzone]
,[ScheduleDate]
,[NextDayDelivery]
,[StdDayDelivery]
FROM [tbl_Sys_QuickstartDeliveryQuota]
END
ELSE
BEGIN
-- OTHER QUERY HERE --
END
所以上面只是检查小时并根据它进行查询。如果在下午6点之前,那么只需查看表中的数据,否则执行另一个查询,这就是我所坚持的。
以上样本数据是在第二天开始生成的,所以如果今天是2014-07-10,那么数据将从2014-07-11开始。如果第二天是工作日或星期六,并且所有后续日期都设置为0,那么NextDayDelivery列将始终为1,如果在工作日或星期六,则StdDayDelivery列将为1,如果是星期日或银行假日,则为0。
如果时间在6之后,我需要做的是调整结果,因为这会改变第二天的交付。
我的想法是使用StdDayDelivery列来计算下一个可用的交付日,然后在提供的示例数据中,2014-07-12将成为NextDayDelivery结果的第一行(如果今天是第11行)根据StdDayDelivery设置为1设置为1.如果今天的日期是2014-07-12那么结果将从14日开始,因为13日是星期日,所以下一个可用的交付日是14日,所以NextDayDelivery是14日1点。
我希望这是有道理的。
两个预期产出将是:
如果今天是Friday the 11th
,结果将是:
2014-07-12 1 1
2014-07-13 0 0
2014-07-14 0 1
2014-07-15 0 1
2014-07-16 0 1
2014-07-17 0 1
2014-07-18 0 1
如果今天是Sat the 12th
,结果将是:
2014-07-13 0 0
2014-07-14 1 1
2014-07-15 0 1
2014-07-16 0 1
2014-07-17 0 1
2014-07-18 0 1
(第13个值设为0,因为StdDayDelivery显示0,因为它是星期日)
答案 0 :(得分:0)
看起来CROSS APPLY
可以帮助您完成此任务。
为[NextDayDelivery]计算
创建表函数IF OBJECT_ID(N'dbo.GetData', N'TF') IS NOT NULL
DROP FUNCTION dbo.GetData;
GO
CREATE FUNCTION GetData(@ScheduleDate AS DATETIME, @testDay AS DATETIME)
RETURNS @VV TABLE
(
[NextDayDelivery] bit
)
AS
BEGIN
INSERT INTO @VV
SELECT
CASE
WHEN (DATEDIFF(dd, @testDay, @ScheduleDate)=1 AND DATEPART(dw, @ScheduleDate)>1) OR
(DATEDIFF(dd, @testDay, @ScheduleDate)=2 AND DATEPART(dw, @testDay)=7) THEN 1
ELSE 0
END
AS [NextDayDelivery]
RETURN
END
GO
在SELECT
中使用此功能DECLARE @testDay DATETIME
SET @testDay = DATEADD(d,1,GETUTCDATE())
-- SET @testDay = GETUTCDATE()
SELECT t.[ScheduleDate], VV.[NextDayDelivery], t.StdDayDelivery
FROM [tbl_Sys_QuickstartDeliveryQuota] AS t
CROSS APPLY GetData(t.[ScheduleDate], @testDay) AS VV
where t.[ScheduleDate] > @testDay
注意:我的代码假设一周的第一天是星期日。即SELECT DATEPART(dw, '2014-07-12')
返回7
。如果您使用其他文化,请更正我的代码。