在结果中的某个点开始结果集

时间:2014-07-11 08:16:43

标签: sql tsql sql-server-2005

我有一个问题,我有点困惑。基本上,我有一个包含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,因为它是星期日)

1 个答案:

答案 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。如果您使用其他文化,请更正我的代码。