-2

我有一个带有日期和其他一些信息的第一张表 T1:

--TABLE1
date, field1, field2, field3...
20120801 | info1    | info2    | ...
20120802 | info1    | info2    | ...
20120803 | info1    | info2    | ...
20120804 | info1    | info2    | ...
20120805 | info1    | info2    | ...
20120806 | info1    | info2    | ...

我有第二个表 T2,其中包含与日期相关的信息,包括工作日和周末:

--TABLE2
date, businessdayofthemonth, day, field4...
20120801 | 1    | Wednesday | ...
20120802 | 2    | Thursday  | ...
20120803 | 3    | Friday    | ...
20120804 | NULL | Saturday  | ...
20120805 | NULL | Sunday    | ...
20120806 | 4    | Lundi     | ...

现在我要做的是:我想为表 1 的每一行设置表 2 的日期,该日期与给定日期后的第三个工作日完全对应 <=> (isnumeric(businessdayofthemonth)=1)

例如,如果我选择 T1 的第一行:

dateT1   | dateT1+3 | TheDateIWant |
20120801 | 20120804 | 20120806     | info1 | info2 | ...

希望我解释正确,谢谢

编辑: 我认为我没有正确解释这一点:我需要在给定日期后正好 3 个工作日的日期,这意味着:

为了:

20120803 | 3    | Friday    | ...

我想要接下来的 3 个工作日日期:

20120808

顺便说一句,为什么要投反对票?我在一个有数十亿行的数据库上工作,这只是我对 300 行请求超过 15 个表所做的工作的一部分,如果我发布,我尝试过。

4

1 回答 1

3

你可以这样做:

select t1.date, t1.field1, t1.field2,
    (
        select top 1 date
        from Table2 t2
        where businessdayofthemonth is not null
        order by abs((t1.Date + 3) - t2.Date)
    ) as T2_Date
from Table1 t1

SQL 小提琴示例

请注意,这将为您提供最近、之前或之后的日期Table1.Date + 3。如果您只想要日期或之后的日期,您可以执行以下操作:

select t1.date, t1.field1, t1.field2,
    (
        select top 1 date
        from Table2 t2
        where businessdayofthemonth is not null
            and t2.Date >= (t1.Date + 3)
        order by t2.Date - (t1.Date + 3)
    ) as T2_Date
from Table1 t1
于 2012-10-22T15:07:32.240 回答