台灣最大程式設計社群網站
線上人數
613
 
會員總數:245218
討論主題:189090
歡迎您免費加入會員
討論區列表 >> MS SQL >> SQL指令如何算工作日(一周減去六、日兩天)
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
SQL指令如何算工作日(一周減去六、日兩天)
價值 : 30 QP  點閱數:12180 回應數:12

樓主

cat
門外漢
0 28
444 76
發送站內信

請問各位大大我查詢指令要怎麼下才能得到工作日?

我的題目如下:

起始時間:2013/3/1
結束時間:2013/3/15

超過結束日期,2013/3/25(系統時間)-2013/3/16(2013/3/15後一天)為9日,但因為中間有假日,以工作日來算即為6日

我有google找相關資訊,其中找到的是:

但又不太吻合我要的東西

再請各位前輩幫幫忙



本篇文章發表於2013-03-25 17:21
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

pilipala
檢舉此回應

可以解釋一下你提供的 T-SQL 語法是要表達甚麼意思嗎


超過結束日期,2013/3/25(系統時間)-2013/3/16(2013/3/15後一天)為9日,但因為中間有假日,以工作日來算即為6日


把六日給扣除掉,不就可以得到工作日為六天
本篇文章回覆於2013-03-25 20:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
建立一個行事曆資料表 區分平假日 在行事曆表中用between就可算出工作日

我是用求出每月第一天跟最後一天的方式用數字型態 再跑回圈塞入行事曆資料表

declare @yyyymm nvarchar(6)

set @yyyymm='201303'

declare @月第一天 datetime;
declare @月最後一天 datetime;
set @月第一天 = convert(datetime,left(@yyyymm,4)+'-'+substring(@yyyymm,5,2)+'-'+'01');
set @月最後一天 = convert(datetime,left(@yyyymm,4)+'-'+substring(@yyyymm,5,2)+'-'+'01');
set @月最後一天 = dateadd(mm,1,@月最後一天)-1;
select CONVERT(varchar(12) ,@月第一天 , 112 ) as 月第一天 ,CONVERT(varchar(12) , @月最後一天, 112 ) as 月最後一天
本篇文章回覆於2013-03-26 08:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

cat
檢舉此回應
回pilipala大大,

假設我現在有個結束日期是2013/03/15

那我要計算這結束日期到今日2013/03/26,

但我的要求是要從這結束日期的後一天開始計算

也就是03/16開始算再扣除假日這樣
本篇文章回覆於2013-03-26 09:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

柏克
檢舉此回應

DECLARE @開始 DATETIME = '2013-03-16'
,@結束 DATETIME = '2013-03-25'

;WITH 天 (日期)
AS(SELECT @開始
UNION ALL
SELECT 日期+1 FROM 天 WHERE (日期+1) <= @結束 )
SELECT SUM(CASE WHEN DATEPART(DW,日期) IN (1,7) THEN 0 ELSE 1 END)
FROM 天
本篇文章回覆於2013-03-26 09:51
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

cat
檢舉此回應
謝謝柏克大大的回覆,但結果不太對

要是開始時間改成其他日期算出的天數就不對了T_T

本篇文章回覆於2013-03-26 10:24
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

pilipala
檢舉此回應

假日指的是六日的話,利用 DATEPART() 就可以找出六日,你自己 PO 的 T-SQL 語法不就有用上它。
MSDN DATEPART() http://msdn.microsoft.com/zh-tw/library/ms174420.aspx

真的有點難 前輩提到的行事曆資料表也是常見的作法,六日也可能因為彈休關係補上班喔,今年的農曆過年就是啦。
之前的討論,可以參考看看 http://www.blueshop.com.tw/board/FUM20041006152735ZFS/BRD201201311044282FW.html


要是開始時間改成其他日期算出的天數就不對了T_T


其他日期是指哪個日期區間,^^??
花點時間了解柏克大的語法吧 ~~
本篇文章回覆於2013-03-26 10:39
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
不錯的參考

真的有點難
檢舉此回應
create table #行事曆
(資料編號 int identity(1,1),
日期 nvarchar(50),
假日 nvarchar(50) default('否')
)

DECLARE @i INT
DECLARE @MAX INT
SET @i = 0
SET @MAX = 31
WHILE (@i<@MAX)
BEGIN

Set @i=@i+1
insert into #行事曆 (日期)
select convert(nvarchar(4),year(dateadd(d,@i,'2013/02/28')))
+ right('0'+ convert(nvarchar(2),month(dateadd(d,@i,'2013/02/28'))),2)
+ right('0'+ convert(nvarchar(2),day(dateadd(d,@i,'2013/02/28'))),2)
END

update #行事曆 set 假日='是' where 日期 in('20130302','20130303','20130309','20130310','20130316','20130317','20130323','20130324','20130330','20130331')

select count(*) from #行事曆 where 日期 between '20130316' and '20130325' and 假日='否'

--select * from #行事曆 where 日期 between '20130316' and '20130325' and 假日='否'

drop table #行事曆
本篇文章回覆於2013-03-26 16:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
最有價值解答

柏克
檢舉此回應
也就是03/16開始算再扣除假日這樣 [/quote]

這假日的定義是??
六日? 國定假日?

DECLARE @行事曆 TABLE(日期 date)
DECLARE @開始 DATETIME = '2013-01-01'
,@結束 DATETIME = '2013-12-31'

;WITH 天 (日期)
AS(SELECT @開始
UNION ALL
SELECT 日期+1 FROM 天 WHERE (日期+1) <= @結束 )
INSERT INTO @行事曆
SELECT 日期 FROM 天 WHERE DATEPART(DW,日期) NOT IN (1,7)
OPTION (MAXRECURSION 0)

SELECT * FROM @行事曆

這是全1~5 假日自已扣吧 補假自已加
台灣放假日實在太亂了
本篇文章回覆於2013-03-26 17:20
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
不錯的參考

怎有人這麼喜歡改暱稱
捐贈 VP 給 怎有人這麼喜歡改暱稱 檢舉此回應
我是另外定一個 holiday table
先把來年的周六日 都先定進去
再來 看 人士型政局 的公告
把 非假日(含補假)剔除 國定假日 加進去
這樣 只需要把這日期的區間(between) 帶入
就可以知道 這時間內 有幾天是不上班的假日

你知道 這期間內 有幾天, 又知道 這期間 有幾天是假日
剩下的 當然就是工作天了...

本篇文章回覆於2013-03-26 22:08
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

cat
檢舉此回應
各位前輩,原來我漏掉一個Table,裡面定義了假日天,只要把裡面的資料撈出來做判斷就可以了

謝謝各位大大的幫忙^_^
本篇文章回覆於2013-03-27 14:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
其實 我的 holiday table不是用來算日子用

是決定要不要讓某些人在假日可以進出某些門用
本篇文章回覆於2013-03-30 21:44
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

Willie Chou
檢舉此回應
Hi ,

我目前在SAPB1裡用這個方式來計算WorkingDate,並且我寫在我的Blog裡面,希望能對你有幫助

http://nagagechou.blogspot.tw/2016/04/sapb1-get-working-day-difference.html
本篇文章回覆於2016-04-14 13:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.