回答

收藏

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

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

我正在尝试重构ASP.Net网站中的某些代码,并且正在编写的存储过程有问题。
  B! ^8 U: Z) @$ \7 O我想做的是获取一个日期范围,然后从表格中选择该范围内的所有数据,但如果不存在日期,我仍然需要选择一行。
1 ^$ a# f* F8 D正如您在下面的代码中看到的那样,我的想法是创建一个临时表,并用日期范围内的所有日期填充该表,然后将其加入到我要选择的表中,但这是行不通的。我在这里做错什么了吗?tempDate列在此联接中始终为null,但是我已经检查了表,并且表中确实有数据。; L$ T% I" r& J
-- Parameters
4 F9 j' k% F. Y2 X1 f- uDECLARE @DutyDate datetime='2012-01-01 00:00:00'5 F5 M9 I: @: D3 T, |- s+ h
DECLARE @InstructorID nvarchar(2) = N'29'6 e: |  O: S. I. @
DECLARE @datesTBL TABLE (tempDate DATETIME)3 d3 C) ^2 w; w8 k
-- Variables# h$ |6 I( M! l4 b1 Z1 a9 N
DECLARE @StartDate DATETIME $ a; M+ X" U, M1 H9 i% \# g
DECLARE @EndDate DATETIME
  U* [/ H* c, ESELECT $ R' B  M% D: Y
    @StartDate =StartDate, / b5 R0 D* M% K0 t; r
    @EndDate = EndDate
& d# M8 e; {* y) l( |" ]' A& R) q4 ]& PFROM % Z" ]; R- h- k2 {
    DutyPeriodTbl
# r7 B% f! z% j- u! M/ GWHERE 2 m/ Y* ^. z$ N1 ^% J/ I# o; @& g/ X
(StartDate = @DutyDate)( G0 z& i4 S5 z

6 l( `7 K- X) q! _DECLARE @d DATETIME = @StartDate ) d! C7 K* v$ W0 y
WHILE @d<=@EndDate
: K. J4 M+ ^7 E6 \1 d9 ^7 _0 M! f* |BEGIN2 Y( m6 p* B& o' P$ {
    INSERT INTO @datesTBL VALUES (CONVERT(DATETIME, @d, 102))
- [+ f/ m& `( _4 P& X( p5 _    SET @d=DATEADD(day,1,@d)
  o; l4 F/ f; q* c/ h3 v. x% CEND3 W9 t3 j2 }! w! b" d' M! Y8 S
SELECT ) l8 \+ e, h" q
    dt.tempDate ,( P' W# {3 z7 a# d, u1 v$ k7 [, @
    InstructorID,           EventStart,
. z: r  V$ V/ {' V8 J) R8 n/ P    EventEnd,               cancelled,
0 u/ j4 [8 D( l    cancelledInstructor,
# M; B% t% B! k    EventType,              DevName, 6 D: ]4 u  B; D' M! B" m" |' e
    Room,                   SimLocation,
" j: R/ ~4 R% s" v% ]    ClassLocation,          Event, / ~5 M" L' I; N1 \0 {3 I
    Duration,               TrainingDesc,
% Q6 K. r( b1 Q6 T    Crew,                   Notes, 2 u. d% ^0 W, q6 a2 s4 @8 s1 P
    LastAmended,            InstLastAmended, / ?. X+ `* i7 s
    ChangeAcknowledged,     Type, . f) u: ?0 f' F$ h  ]; t4 @8 w
    OtherType,              OtherTypeDesc,
5 h- z: m6 C- i, t( D! I1 H    CourseType
: W) S& u1 W, A$ {" [5 l! ~9 t9 l( cFROM ) e/ ^0 A4 z+ d& P( u0 o
    OpsInstructorEventsView iv5 Z2 h1 E, ?. `1 P4 k; Q
LEFT OUTER JOIN
1 h. b1 s3 ^/ `6 Z0 {* {    @datesTBL dt
! {3 n8 d) e7 G  k$ BON
; k9 C. U! l- N% v9 z    CONVERT(DATETIME, iv.EventStart, 102) = CONVERT(DATETIME, dt.tempDate, 102) 9 ~5 i2 X1 ]% V% g3 O! p' f2 {
WHERE # t2 Y& h$ I+ x9 j4 l& e+ q6 L
    InstructorID = @InstructorID , y: `+ D/ b* u% B5 |) v
AND
. X2 Q1 G' O& A    EventStart BETWEEN CONVERT(DATETIME, @StartDate, 102) AND CONVERT(DATETIME, @EndDate, 102)9 d- O! F6 {2 I0 `, d
ORDER BY
9 q5 j$ a+ y% h; x, o) K& j    EventStart6 ^" k# e, I) M4 R
               
% J* y: V6 m- J, R1 {! V解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则