어떻게 추정날짜에서 SQL 서버를 계산하는 일일 수?

0

질문

이것은 어떻게 데이터는 것 같습니다. 그것은 긴 테이블

enter image description here

나는 필요의 수를 계산하는 사람들에 의해 고용일

enter image description here

를 작성하는 방법 SQL Server 논리를 이 결과는? I treid 을 만드는 날짜 표와 그 가입하세이지만,이는 오류가 발생하기 때문에 이 테이블은 너무 큽니다. 해야 할 재귀 로직?

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; 

자신을 찾으면 이런 종류의 계산은 종종 좋은 아이디어를 달력을 만들이다. 추가할 수 있습니다 다른 속성을 같는 경우 그것은 하루에 일주일 등등.

약 조건으로:

CHECK(hired <= retired)

첫 번째 부분에 간단하게 할 수 있:

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

고 가정하고 현재 직원 NULL 은퇴 날짜

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

도 제한 범위의 날짜 표입니다. 이 예에서 나는 테이블의 날짜는 이름 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ý
..................................................................................................................