选择适当的日期

时间:2012-10-22 14:54:28

标签: sql sql-server

我有第一张表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的日期与给定日期之后的第3个工作日完全对应< => (ISNUMERIC(businessdayofthemonth)= 1)

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

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

希望我正确解释,谢谢

修改 我想我没有解释这个问题:我需要在给定日期之后3个工作日的日期,这意味着:

有:

20120803 | 3    | Friday    | ...

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

20120808
btw为什么要downvote?我在一个数十亿行的数据库上工作,这只是我在超过15个表的300行请求中所做的工作的一部分,如果我发布,我试过。

1 个答案:

答案 0 :(得分: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 Fiddle Example

请注意,这将为您提供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