Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

छुट्टियों को छोड़कर, 2 तिथियों के बीच व्यावसायिक दिनों की संख्या प्राप्त करने के लिए SQL सर्वर क्वेरी

create table MyTable
(
 start_date date not null,
 end_date date not null,
 code int not null
)
GO

create table HolidayDates
(
   holydayDate date not null,
   holydayDescription varchar(100) not null
)
GO

insert into MyTable
values
 ('2018-12-25','2019-01-01',101)
,('2018-12-01','2019-01-31',102)
,('2018-12-24','2019-01-02',103)
GO

insert into HolidayDates
values
 ('2018-12-25', 'xmas')
,('2019-01-01', 'Reveillon')
GO

नीचे दी गई क्वेरी में आप देख सकते हैं कि कॉलम की गणना कैसे की जाती है।

[पवित्र दिन (सप्ताहांत नहीं)]: सभी पवित्र दिन प्राप्त करें आपकी तालिका भी सप्ताहांत नहीं है (इसलिए उन्हें दो बार नहीं गिना जाता है)।

सप्ताहांत: इस अवधि में सप्ताहांत प्राप्त करें।

बाकी कॉलम स्व-व्याख्यात्मक हो सकते हैं

अस्वीकरण , आप इसे थोड़ा सरल कर सकते हैं, यह केवल एक उदाहरण प्रश्न है कि कैसे उपयोग किया जाए

DATEPART

DATEDIFF

DATNAME

select 
  datediff(day, mt.start_date, mt.end_date) as [total days], 
  (
    select 
      count(*) 
    from 
      HolidayDates hd 
    where 
      hd.holydayDate between mt.start_date 
      and mt.end_date 
      and DATEPART(WEEKDAY, hd.holydayDate) between 2 
      and 6
  ) as [holydays (not weekends) ], 
  (
    select 
      (
        datediff(wk, mt.start_date, mt.end_date) * 2
      ) +(
        case when datename(dw, mt.start_date) = 'sunday' then 1 else 0 end
      ) +(
        case when datename(dw, mt.end_date) = 'saturday' then 1 else 0 end
      )
  ) as weekends, 
  case when datediff(day, mt.start_date, mt.end_date) -(
    select 
      (
        datediff(wk, mt.start_date, mt.end_date) * 2
      ) +(
        case when datename(dw, mt.start_date) = 'sunday' then 1 else 0 end
      ) +(
        case when datename(dw, mt.end_date) = 'saturday' then 1 else 0 end
      )
  ) -(
    select 
      count(*) 
    from 
      HolidayDates hd 
    where 
      hd.holydayDate between mt.start_date 
      and mt.end_date 
      and DATEPART(WEEKDAY, hd.holydayDate) between 2 
      and 6
  ) > 3 then 0 --> this need to exclude weekend and holidays
  when mt.code = 1 then 1 when mt.code = 2 then 2 else 3 end as mycolumn 
from 
  MyTable mt

रिटर्न

total days  holydays (not weekends) weekends    mycolumn
----------- ----------------------- ----------- -----------
7           2                       2           3
61          2                       18          0
9           2                       2           0

(3 row(s) affected)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. स्पॉटलाइट क्लाउड अलार्म संग्रह टाइम्स

  2. SQL सर्वर नामित इंस्टेंस को डिफ़ॉल्ट इंस्टेंस में बदलना

  3. कॉलम मान को केवल एक बार कैसे दिखाना है यदि इसे दोहराया जाता है और अलग-अलग मान sql में आने तक खाली रहता है

  4. संग्रहीत प्रक्रिया क्लासिक एएसपी से एक मूल्य और परिणाम सेट लौटाएं

  5. SQL सर्वर में JSON दस्तावेज़ से डुप्लिकेट कुंजियाँ कैसे लौटाएँ?