# 取得日期區間內工作日
###### tags: `SQL` `ORACLE` `MSSQL`
mssql
```sql=
USE [LCMS]
GO
/****** Object: UserDefinedFunction [dbo].[F_WORKING_DAY] Script Date: 2020/6/3 上午 10:16:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*取得日期區間內預設工作日*/
ALTER FUNCTION [dbo].[F_WORKING_DAY]
(
@StartDate DATE,
@EndDate DATE
)
RETURNS INT
AS
BEGIN
IF @StartDate IS NULL RETURN NULL
IF @EndDate IS NULL RETURN NULL
IF @StartDate > @EndDate RETURN NULL
RETURN
(DATEDIFF(DAY, @StartDate, @EndDate) + 1)
-(DATEDIFF(WEEK, @StartDate, @EndDate) * 2)
-(CASE WHEN DATEPART(WEEKDAY, @StartDate) in (1,7) THEN 1 ELSE 0 END)
END
```
# oracle
```sql
CREATE OR REPLACE FUNCTION LCMS.F_WORKING_DAY(P_START_DT DATE, P_END_DT DATE) RETURN NUMBER AS
v_cnt number;
v_start_dt date;
v_end_dt date;
BEGIN
IF P_START_DT IS NULL OR P_END_DT IS NULL THEN
return null;
END IF;
IF P_START_DT > P_END_DT THEN
return null;
END IF;
v_end_dt := trunc(P_END_DT);
v_start_dt := trunc(P_START_DT);
select count(1) into v_cnt
from (
select (v_end_dt-level+1) dt
from dual
connect by level <= (trunc(v_end_dt - v_start_dt)+1)
)
where dt >= v_start_dt
and to_char(dt,'D') not in(1,7);
return v_cnt;
END F_WORKING_DAY;
/
```