0

我有以下 2 张桌子

表格1

 Plant      
 -----
 TRP1
 DEP1

表2

Config
------
84ROC20
100ROC20

和 2 个文本框

1.开始日期(日期时间):2012-08-01 00:00:00.000

2.结束日期(日期时间):2012-10-01 00:00:00.000

我希望有下表作为结果,有 3 列

Plant  Config    Time
-----  ------   -------
TRP1   84ROC20   2012-08-01 00:00:00.000 
TRP1   84ROC20   2012-09-01 00:00:00.000 
TRP1   84ROC20   2012-10-01 00:00:00.000
DEP1   84ROC20   2012-08-01 00:00:00.000 
DEP1   84ROC20   2012-09-01 00:00:00.000
DEP1   84ROC20   2012-10-01 00:00:00.000
TRP1   100ROC20  2012-08-01 00:00:00.000
TRP1   100ROC20  2012-09-01 00:00:00.000 
TRP1   100ROC20  2012-10-01 00:00:00.000
DEP1   100ROC20  2012-08-01 00:00:00.000 
DEP1   100ROC20  2012-09-01 00:00:00.000
DEP1   100ROC20  2012-10-01 00:00:00.000

你能帮忙拿这张桌子吗

4

1 回答 1

0

我假设 SQL Server 2005+(为方便起见使用递归 CTE),但这应该可以帮助您:

-- Get user data
declare @StartDate datetime = '2012-08-01'
declare @EndDate datetime = '2012-10-01'

-- Actual query
;with Dates as ( -- Build a date table based upon the user values
    select @StartDate as DateEntry -- Start at StartDate
    union all
    select dateadd(m, 1, DateEntry) -- Recursively add a month
    from Dates
    where dateadd(m, 1, DateEntry) <= @EndDate -- Until the EndDate is reached
)
select *
from Plant, Config, Dates -- Cross-join all tables to get all possibilities
order by Config desc, Plant desc, DateEntry

这将为您的测试数据提供以下输出:

Plant      Config     DateEntry
---------- ---------- -----------------------
TRP1       84ROC20    2012-08-01 00:00:00.000
TRP1       84ROC20    2012-09-01 00:00:00.000
TRP1       84ROC20    2012-10-01 00:00:00.000
DEP1       84ROC20    2012-08-01 00:00:00.000
DEP1       84ROC20    2012-09-01 00:00:00.000
DEP1       84ROC20    2012-10-01 00:00:00.000
TRP1       100ROC20   2012-08-01 00:00:00.000
TRP1       100ROC20   2012-09-01 00:00:00.000
TRP1       100ROC20   2012-10-01 00:00:00.000
DEP1       100ROC20   2012-08-01 00:00:00.000
DEP1       100ROC20   2012-09-01 00:00:00.000
DEP1       100ROC20   2012-10-01 00:00:00.000

本质上,这里的技巧是动态构建 Dates 表,然后将其与 Plant 和 Config 交叉连接。您可以通过各种其他方式构建 Dates 表,例如使用计数表、游标、while 循环、在 asp.net 本身中等等。我喜欢这里递归 CTE 的易用性,尽管我假设一个需要生成少量日期。超过 100 个日期将需要设置 maxrecursion,如果性能有问题则不完全选择另一种方法。

于 2012-10-17T19:52:04.717 回答