回答

收藏

从日期范围内的表中选择所有日期,每个空日期包括1行

技术问答 技术问答 248 人阅读 | 0 人回复 | 2023-09-12

我正在尝试重构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
解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则