วิธี extrapolate วันที่ในภาษา sql เซิร์ฟเวอร์ต้องคำนวณทุกวันนับ?

0

คำถาม

นี่คือข้อมูลดูเหมือนว่า. มันนานมากโต๊ะ

enter image description here

ฉันต้องคำนวณเลขของคนที่จ้างมาทำงานโดยวัน

enter image description here

วิธีที่จะเขียนภาษา sql เซิร์ฟเวอร์ตรรกะจะได้ผล? ฉัน treid เพื่อสร้างเป็นวันที่โต๊ะแล้วก็ร่วมแต่มันทำให้เกิดข้อผิดพลาดเกิดขึ้นระหว่างเพราะโต๊ะมันใหญ่เกินไป ฉันต้องการ recursive ตรรกะ?

sql sql-server tsql
2021-11-23 19:56:48
4
0

สำหรับอนาคตถามคำถาม,อย่าโพสรูปภาพของข้อมูลออกมา แทนที่จะใช้บริการเหมือน dbfiddle. ฉันจะยังไงก็แล้วเพิ่มรูปพรสำหรับคำตอบกันดีกว่า-เตรียมคำถามคุณควรจะได้เป็นสมบูรณ์ตอบคำถาม ยังไงก็แล้วนี่มันเป็น:

-- extrema is the least and the greatest date in staff table
with extrema(mn, mx) as (
    select least(min(hired),min(retired)) as mn
         , greatest(max(hired),max(retired)) as mx
    from staff
), calendar (dt) as (
    -- we construct a calendar with every date between extreme values
    select mn from extrema
    union all
    select dateadd(day, 1, d)
    from calendar
    where dt < (select mx from extrema)
)
-- finally we can count the number of employed people for each such date
select dt, count(1) 
from calendar c 
join staff s
    on c.dt between s.hired and s.retired
group by dt; 

ถ้าคุณพบว่าตัวเองทำเรื่องนี้เป็นการคำนวณบ่อยครั้งมันเป็นความคิดที่ดีที่จะสร้างปฏิทินโต๊ะ คุณสามารถเพิ่มอีกแอททริบิวต์ต่างๆที่มันอย่างเช่นถ้ามันเป็นวันของในตอนกลางสัปดาห์นี้เป็นต้น

กับ constraint เป็น:

CHECK(hired <= retired)

ส่วนแรกจะได้เป็นประยุกต์@item text character set ไปยัง:

with extrema(mn, mx) as (
    select min(hired) as mn
         , max(retired) as mx
    from staff
),
2021-11-23 20:45:14
0

เดาว่าปัจจุบันพนักงานต้องเป็นโพรโทคอล aimcomment ยๆนายจำได้แดนนี่แพล็ทได้ใช่มั้เดท

Declare @Date1 date = '2015-01-01'
Declare @Date2 date = getdate()

Select A.Date
      ,HeadCount = count(B.name)
 From ( Select Top (DateDiff(DAY,@Date1,@Date2)+1) 
               Date=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),@Date1) 
         From  master..spt_values n1,master..spt_values n2
      ) A
 Left Join YourTable B on A.Date >= B.Hired and A.Date <= coalesce(B.Retired,getdate())
 Group BY A.Date
2021-11-23 20:34:49
0

คุณต้องการเป็นปฏิทินโต๊ะสำหรับเรื่องนี้ คุณเริ่มต้นกับปฏิทินและทิ้งร่วมกับทุกอย่างอื่นอีกใช้ BETWEEN ตรรกะ.

คุณสามารถใช้ของจริงโต๊ะด้วย หรือคุณสามารถสร้างมันขึ้นบินได้เหมือนนี้:

WITH
    L0 AS ( SELECT c = 1
            FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),
                        (1),(1),(1),(1),(1),(1),(1),(1)) AS D(c) ),
    L1 AS ( SELECT c = 1 FROM L0 A, L0 B, L0 C, L0 D ),
    Nums AS ( SELECT rownum = ROW_NUMBER() OVER(ORDER BY (SELECT 1))
              FROM L1 ),
    Dates AS (
      SELECT TOP (DATEDIFF(day, '20141231', GETDATE()))
        Date = DATEADD(day, rownum, '20141231')
      FROM Nums
    )

SELECT
  d.Date,
  NumEmployed = COUNT(*)
FROM Dates d
JOIN YourTable t ON d.Date BETWEEN t.Hired AND t.Retired
GROUP BY
  d.Date;

ถ้าวันของคุณมีเวลาส่วนประกอบแล้วคุณต้องการที่จะใช้ >= AND < ตรรกะ

2021-11-23 20:49:37
0

พยายาม limiting งขอบเขตของเดทของคุณแล้ว ในนี้ตัวอย่างผมมีโต๊ะของวันตั้งชื่อ TallyStickDT.

SELECT dt, COUNT(name)
FROM (
    SELECT dt
    FROM tallystickdt
    WHERE dt >= (SELECT MIN(hired) FROM #employees)
    AND dt <= GETDATE()
) A
LEFT OUTER JOIN #employees E ON A.dt >= E.Hired AND A.dt <= e.retired
GROUP BY dt
ORDER BY dt
2021-11-23 20:44:03

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่