|
我正在尝试重构ASP.Net网站中的某些代码,并且正在编写的存储过程有问题。
( m) _' @1 e# @& I" w6 f) F) p. w3 U我想做的是获取一个日期范围,然后从表格中选择该范围内的所有数据,但如果不存在日期,我仍然需要选择一行。' w3 {$ q1 e8 C4 K# @$ t
正如您在下面的代码中看到的那样,我的想法是创建一个临时表,并用日期范围内的所有日期填充该表,然后将其加入到我要选择的表中,但这是行不通的。我在这里做错什么了吗?tempDate列在此联接中始终为null,但是我已经检查了表,并且表中确实有数据。
8 O% Z- E) E* p! y. G-- Parameters- t. y: `5 z+ j0 I% B
DECLARE @DutyDate datetime='2012-01-01 00:00:00'
2 c& J+ c7 D' g: C J0 w- UDECLARE @InstructorID nvarchar(2) = N'29'2 x6 O$ [$ T2 o, W
DECLARE @datesTBL TABLE (tempDate DATETIME)
& W- j+ N* m, y2 G-- Variables
4 @, Q8 P% W# a7 p& z, o% ~: A- B/ \DECLARE @StartDate DATETIME
, n0 Z8 x5 ` v- \1 H% I% NDECLARE @EndDate DATETIME
* g0 P \1 x8 J" n7 aSELECT # [4 c8 m3 q( v8 I, U. d/ u
@StartDate =StartDate, , h s' k' P8 ?4 t
@EndDate = EndDate8 u. j0 z% W) V! I: @, P3 H
FROM 2 r6 w M2 `) o( P6 X; N# |7 H0 t" r
DutyPeriodTbl $ ?( \8 E: W+ j( ~" I2 a4 j ~
WHERE
f4 o1 I* v3 }( ?9 F(StartDate = @DutyDate)
$ x Q4 z" D( \0 I" p% q4 O$ a/ e! |# l4 X9 {& I d! n- ]' N2 |
DECLARE @d DATETIME = @StartDate 5 i7 r8 w6 [& W2 @
WHILE @d<=@EndDate+ Q- ]3 {3 B8 p4 @: G
BEGIN
: r1 W4 q7 Q5 w' y' V: r INSERT INTO @datesTBL VALUES (CONVERT(DATETIME, @d, 102))
0 J$ V, ~# j- j# e) f9 r3 Y SET @d=DATEADD(day,1,@d)( U1 K4 i4 O! G* A
END
/ A: m. ^% e. |! \SELECT 1 d5 v R3 I; N ]0 A5 w
dt.tempDate ,1 Q0 R" h Y z! M
InstructorID, EventStart,
8 C, K0 J( }3 g% U EventEnd, cancelled,
9 G# E E0 v& H( s9 O cancelledInstructor,
# m9 A9 L- |0 k% j4 y7 U* R EventType, DevName, ) v5 j8 m0 j! p! ~
Room, SimLocation,
( t5 C' E" P. B4 V* Q ClassLocation, Event, ( l! e" N# T6 G) I( T
Duration, TrainingDesc,
+ S; L- f8 q# a8 F+ P; f Crew, Notes,
) V/ d. d; Y& J+ Y: E LastAmended, InstLastAmended,
! d2 a; n$ \7 _, I) G1 p ChangeAcknowledged, Type,
% y, V& U0 ^ f$ |( b4 p OtherType, OtherTypeDesc, 8 p1 m. F$ Y. ]% w. R
CourseType
% k, M! z& v9 r6 N7 m9 T9 {* SFROM
( Q5 O- ?, T# {2 j) g' S! K9 L OpsInstructorEventsView iv& g( `, d8 e/ F8 Q+ b* I) ?" Z% P
LEFT OUTER JOIN
6 r) n, Q5 T' A# \- K1 D @datesTBL dt
, p0 R* |& p: w) ?ON! D- Z) ]( p7 N+ |# A5 f1 b
CONVERT(DATETIME, iv.EventStart, 102) = CONVERT(DATETIME, dt.tempDate, 102)
( q1 O+ H% m4 t/ FWHERE 7 o7 E; R# X; f. q/ [' L, |- b
InstructorID = @InstructorID 7 s" v9 F7 o9 y3 v% ]
AND / B1 M; b+ r- D2 A/ S5 u
EventStart BETWEEN CONVERT(DATETIME, @StartDate, 102) AND CONVERT(DATETIME, @EndDate, 102)
2 R2 K9 m6 N* O8 Q D$ p+ rORDER BY
, z8 N- t5 p6 O5 ? R1 v2 U2 q6 J EventStart L$ }4 W1 K' Y/ q1 T3 B
`" H* J# m& i/ c4 b9 P
解决方案: |
|