SQL Server 주말과 공휴일을 제외한 날짜 차이를 얻는 방법은 무엇입니까?

에 따르면

이 테이블이 있습니다.

tbl_Sales

----------------------------------------
|Item_Code|Sold|Date                   |
|---------+----+-----------------------|
|BBPen100 |30  |2017-04-17 00:00:00.000|
|BBPen100 |21  |2017-04-13 00:00:00.000|
|BBPen100 |13  |2017-04-12 00:00:00.000|
|XSHIRT80 |0   |2017-04-17 00:00:00.000|
|XSHIRT80 |24  |2017-04-14 00:00:00.000|
|XSHIRT80 |9   |2017-04-13 00:00:00.000|
|XSHIRT80 |5   |2017-04-12 00:00:00.000| 
|YBSHADE7 |0   |2017-04-17 00:00:00.000| 
|YBSHADE7 |6   |2017-04-15 00:00:00.000| 
|YBSHADE7 |0   |2017-04-13 00:00:00.000| 
|YBSHADE7 |11  |2017-04-12 00:00:00.000| 
----------------------------------------

지난 2 일 (근무일 기준)에서 0이 아닌 마지막 판매 금액을 어떻게 얻을 수 있습니까? 이것은 주말과 공휴일을 제외해야 함을 의미합니다. 공휴일로 구성된이 테이블이 있습니다.

tbl_Holiday

-------------------------
|Holiday_Date           |
|-----------------------|
|2017-04-14 00:00:00.000|
|2017-05-01 00:00:00.000|
|2017-10-18 00:00:00.000|
|2017-12-25 00:00:00.000|
-------------------------

예를 들어 오늘은 2017-04-18이고 출력은 다음과 같아야합니다.

---------------------
|Item_Code|Last_Sold|
|---------+---------|
|BBPen100 |30       |
|XSHIRT80 |9        |
|YBSHADE7 |0        |
---------------------

목표는 지난 2 일 (영업일 기준)에서 마지막 판매 값을 가져 오는 것이므로 계산은 2017-04-17에 시작됩니다. 출력 분석 :

BBPen100-since it has value from last 1 working day (2017-04-17), that value will be retrieved.
XSHIRT80-Zero value from last 1 working day (2017-04-17)
        -2017-04-16 & 2017-04-15 are weekends
        -2017-04-14 is holiday
        -So value from 2017-04-13 will be retrieved.
YBSHADE7-Zero value from last 1 working day (2017-04-17)
        -2017-04-16 & 2017-04-15 are weekends
        -2017-04-14 is holiday
        -2017-04-13 has Zero value
        -2017-04-12 is beyond Last 2 working days
        -So value retrived should be Zero

현재 다음 쿼리가 있습니다.

SELECT Item_Code, Sold AS 'Last_Sold'
FROM tbl_Sales
WHERE CONVERT(date, [DATE]) = CASE
                                WHEN CONVERT(date, [DATE]) = CONVERT(date, DATEADD(day, -1, GETDATE())) THEN CONVERT(date, DATEADD(day, -1, GETDATE()))
                                WHEN CONVERT(date, [DATE]) <> CONVERT(date, DATEADD(day, -1, GETDATE())) THEN CONVERT(date, DATEADD(day, -2, GETDATE()))

그러나 물론 이것은 요구 사항을 충족하지 않습니다.

이 문제를 해결하도록 도와주세요.

중요 사항 : 주말의 공휴일과 주말이나 공휴일에 프로그램을 실행하면 어떻게되는지 고려하십시오.

미리 감사드립니다.

TriV

당신은 그것을 시도 할 수 있습니다

샘플 데이터

DECLARE @SampleData as TABLE (Item_Code varchar(10), Sold int, Date datetime)
Insert into @SampleData VALUES
('BBPen100', 30,'2017-04-17 00:00:00.000'),
('BBPen100', 21,'2017-04-13 00:00:00.000'),
('BBPen100', 13,'2017-04-12 00:00:00.000'),
('XSHIRT80', 0 ,'2017-04-17 00:00:00.000'),
('XSHIRT80', 24,'2017-04-14 00:00:00.000'),
('XSHIRT80', 9 ,'2017-04-13 00:00:00.000'),
('XSHIRT80', 5 ,'2017-04-12 00:00:00.000'),
('YBSHADE7', 0 ,'2017-04-17 00:00:00.000'),
('YBSHADE7', 6 ,'2017-04-15 00:00:00.000'),
('YBSHADE7', 0 ,'2017-04-13 00:00:00.000'),
('YBSHADE7', 11,'2017-04-12 00:00:00.000')

DECLARE @TblHoliday AS TABLE
(
   Holiday_Date date
)

INSERT INTO @TblHoliday
VALUES
('2017-04-14 00:00:00.000'),
('2017-05-01 00:00:00.000'),
('2017-10-18 00:00:00.000'),
('2017-12-25 00:00:00.000')

DECLARE @CurrentDate datetime = '2017-04-18 00:00:00'

@CurrentDate 전에 @ 2PreviousWorkingDays를 계산할 수 있습니다.

-- 2 Previous Working Day with out Holiday
DECLARE @2PreviousWorkingDay date = CASE
                         WHEN datepart(dw,@CurrentDate) IN (2,3) THEN dateadd(day,-4, @CurrentDate)  -- 2 previous working day before monday
                         WHEN datepart(dw,@CurrentDate) IN (1) THEN dateadd(day,-3, @CurrentDate)   -- 2 previous working day before sunday
                         ELSE dateadd(day,-2, @CurrentDate) -- other day week
                       END
-- with holiday
SELECT @2PreviousWorkingDay = dateadd(day,0 - (SELECT count(1) FROM @TblHoliday th 
                      WHERE  th.Holiday_Date BETWEEN @2PreviousWorkingDay AND @CurrentDate
                      ANd datepart(dw,th.Holiday_Date) NOT IN (7,1) -- calculate only holiday that isn't weekend
                            )                            
                      , @2PreviousWorkingDay    

그리고 원하는 결과 :

;with temps AS
(
SELECT *, row_number() over(PARTITION BY sd.Item_Code ORDER BY sd.[Date] DESC) AS Rn
FROM @SampleData sd
WHERE sd.[Date] >= @2PreviousWorkingDay -- 2 working days
   AND NOT EXISTS (SELECT 1 FROM @TblHoliday th WHERE th.Holiday_Date = Cast(sd.[Date] AS date)) -- not holiday
   AND datepart(dw,sd.[Date]) NOT IN (7,1) -- not weekend
   AND sd.Sold <> 0 -- not zero sold
)
SELECT sd.Item_Code, ISNULL(t.Sold,0) AS Sold FROM
(
   SELECT DISTINCT sd.Item_Code FROM @SampleData sd
) sd
LEFT JOIN temps t ON t.Item_Code = sd.Item_Code AND t.Rn = 1

데모 링크 : Rextester

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

주말과 공휴일을 제외한 날짜를 계산하는 방법은 시작일 / 종료일이 주말 / 공휴일 일 수 있습니까?

Excel에 입력 한 날짜를 기준으로 한 달 (주말 및 미국 공휴일 제외)의 비율을 계산하는 방법은 무엇입니까?

Emacs 캘린더에서 주말과 공휴일을 제외한 날짜를 계산하는 방법

주말 및 공휴일 날짜를 제외하고 MySQL에서 예상 날짜를 찾는 방법은 무엇입니까?

yii2 주말과 공휴일을 제외한 날짜 사이의 날짜 계산 방법

현재 날짜에서 이번 주말과 다음 주말을 찾는 방법은 무엇입니까?

c # 웹앱 주말과 공휴일을 제외하고 근무일 수를 얻는 방법

공휴일과 주말을 제외한 두 날짜의 시간 차이

SQL Server에서 해당 월(날짜 제공)의 모든 첫 주(첫 번째 일요일까지)를 찾는 방법은 무엇입니까?

공휴일을 제외한 두 날짜 사이의 영업일 수를 가져오는 SQL Server 쿼리

SQL 서버는 주말을 제외한 마지막 이전 날짜를 얻습니다.

null을 제외한 여러 열의 최소 날짜를 얻는 방법은 무엇입니까?

SQL에서 주 번호와 요일에서 날짜를 얻는 방법은 무엇입니까?

주말을 제외한 두 날짜 사이의 모든 휴일을 계산하는 방법-Excel

주말과 공휴일을 제외한 날짜에 날짜를 추가하려면 어떻게해야합니까?

(동일한 각 그룹에 대해) 두 행 사이의 날짜 차이를 얻는 방법은 무엇입니까? SQL

MongoDB에서 주말까지 날짜를 얻는 방법은 무엇입니까?

SQL Server에서 Compelete year의 주 번호, 시작 날짜 및 종료 날짜를 얻는 방법은 무엇입니까?

JAVA에서 서로 다른 두 날짜 사이의 근무일 (주말 제외)을 계산하는 방법은 무엇입니까?

Microsoft SQL Server에서 어제 날짜를 테이블에 삽입하는 방법은 무엇입니까?

날짜의 주에 대한 YEAR를 얻는 방법은 무엇입니까?

요일이 주어진 두 날짜 사이의 모든 날짜를 얻는 방법은 무엇입니까?

두 날짜 사이의 매주 금요일 날짜를 얻는 방법은 무엇입니까?

날짜 열을 제외한 모든 행이 NaN 인 위치를 삭제하는 방법은 무엇입니까?

SQL Server에서 두 날짜 사이에 초를 얻는 방법은 무엇입니까?

SQL Server에서 값이 0 인 누락 된 날짜를 얻는 방법은 무엇입니까?

파이썬의 은행 데이터에서 공휴일과 주말을 제외하는 방법

Pyspark 2.2.0에서 주말을 제외한 날짜의 차이를 계산하는 방법

PHP에서 지난 4 주 월요일과 일요일의 날짜를 얻는 방법은 무엇입니까?

TOP 리스트

  1. 1

    PrematureCloseException : 연결이 너무 일찍 닫혔습니다.

  2. 2

    MDRotatingPieChart를 회전하면 각도 대신 x / y 위치가 변경됩니다.

  3. 3

    c # 웹 사이트에서 텍스트를 복사하는 방법 (소스 코드 아님)

  4. 4

    jfreecharts에서 x 및 y 축 선을 조정하는 방법

  5. 5

    ArrayBufferLike의 typescript 정의의 깊은 의미

  6. 6

    Ionic 2 로더가 적시에 표시되지 않음

  7. 7

    복사 / 붙여 넣기 비활성화

  8. 8

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    QT Designer를 사용하여 GUI에 이미지 삽입

  11. 11

    java Apache POI Word 기존 테이블 셀 스타일 및 서식이있는 행 삽입

  12. 12

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

  13. 13

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  14. 14

    C # HttpWebRequest 기본 연결이 닫혔습니다. 전송시 예기치 않은 오류가 발생했습니다.

  15. 15

    어떻게 같은 CustomInfoWindow 다른 이벤트를 할 수 있습니다

  16. 16

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  17. 17

    dataSnapShot.getValue () 반환 데이터베이스에 그겁니다 데이터 종료 널 (null)

  18. 18

    ORA-12557 TNS : 프로토콜 어댑터를로드 할 수 없습니다

  19. 19

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  20. 20

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  21. 21

    C # Asp.net 웹 API-JSON / XML 변환기 API 만들기

뜨겁다태그

보관