A. informix中用sql或者存儲過程取上一個工作日的日期(就是除星期六、星期天,國家法定節日外)
在informix的存儲過程中,截取字元串和在informix的sql里一樣,都是用sting[beg,end]這種方式,比如str=abcdefg,想取第4和第5個字元,就用str[4,5],得到「de」。
informix存儲過程中取當天日期用TODAY,在別的文章里說這是個函數,我說還不如算個變數,因為函數的引用是後面要加括弧的,比如getage(id),而這個是不能帶括弧的,直接用TODAY:
date mydate;
mydate=TODAY;
B. sql怎樣獲取工作日
SELECT datename(weekday, getdate())
返回結果是 星期三
C. SQL怎麼實現所有日期對應的上一工作日和下一工作日
select dateadd( day, -1, getdate() ) 上一工作日,
getdate() 當前工作日,
dateadd(day,1,getdate() ) 下一工作日
D. sql:當前日期是本月第幾個工作日
create table #Holiday(dateday datetime)
insert into #Holiday values('2016-08-03 15:10:23');
insert into #Holiday values('2016-08-05 15:10:23');
insert into #Holiday values('2016-08-11 15:10:23');
insert into #Holiday values('2016-08-15 15:10:23');
SET DATEFIRST 1
DECLARE @CAL DATETIME --需要計算的日期
SET @CAL ='2016-08-07 15:12:41'
;WITH CTE
AS (
SELECT RW=ROW_NUMBER()OVER(ORDER BY name)
FROM [Master].dbo.spt_values --找一個系統表(記錄數超過31的表)
)
,CTE2
AS (
SELECT RW,DT=DATEADD(DAY,RW-DAY(@CAL),@CAL)
FROM CTE
WHERE RW <=DAY(@CAL)
)
,CTE3
AS (
SELECT A.RW,A.DT
,IsHoliday =Case When DATEPART(weekday ,DT) IN(6,7) OR B.dateday is not null THEN 1 ELSE 0 END
FROM CTE2 A
LEFT JOIN #Holiday B ON CONVERT(NVARCHAR(10),A.DT,121) =CONVERT(NVARCHAR(10),B.dateday,121)
)
SELECT Count(1) FROM CTE3
WHERE IsHoliday =0
E. sql 查詢幾個工作日之後的日期
select
datediff('2009-1-1',
'2008-1-1');
用datediff函數,第一個參數是截止時間,第二個參數是起始時間
不好意思,剛才的是mysql,剛看了下sql的文檔發現有點區別-
-,sql的話,用下面的形式:
DATEDIFF
(
datepart
,
startdate
,
enddate
)
所以你要求2個日期之間間隔的天數,這樣寫:
datediff(
dd,
'2008/1/1',
'2009/1/2'
)
這里的dd表示計算天數差
F. sql 查詢幾個工作日之後的日期
select datediff('2009-1-1', '2008-1-1');
用datediff函數,第一個參數是截止時間,第二個參數是起始時間
不好意思,剛才的是mysql,剛看了下sql的文檔發現有點區別- -,sql的話,用下面的形式:
DATEDIFF ( datepart , startdate , enddate )
所以你要求2個日期之間間隔的天數,這樣寫:
datediff( dd, '2008/1/1', '2009/1/2' )
這里的dd表示計算天數差
G. sql節假日變第一個工作日
如果你可以獲得節假日列表,同樣也可以做出來一張全的日歷表calendar
日歷表設置兩列
cdate date, -- 日期
holiday_flag int -- 是否節假日 0/1
主表假設它叫m_tab, 用下面語句獲取節假日的下個工作日
把它存為一張臨時表,並據此更新m_tab 的 B列即可
SELECT COL_A, MIN(CDATE)
FROM (SELECT COL_A
FROM M_TAB, CALENDAR
WHERE COL_A = CDATE
AND HOLIDAY_FLAG = 1) T,
CALENDAR T1
WHERE COL_A < CDATE
AND HOLIDAY_FLAG = 0
GROUP BY COL_A
H. SQL語句計算兩個日期之間有多少個工作日的方法
/*
因為工作中一個奇怪的需求,要用SQL語言計算兩個日期間有多少個工作日。
設定是一個星期有5個工作日,從星期一到星期五
說明:
第一個星期的工作日數:DATEPART(dw, @begdt)-DATEPART(dw, @begdt),最少0天
末一個星期的工作日數:DATEPART(dw, @enddt),最多5天
計算方法:
如果兩個日期處在同一個星期內,直接計算「第一個星期的工作日數」
否則按下面的公式計算
(兩個日期間的總天數 - 第一個星期的天數 - 末一個星期的天數) / 7 * 5
+ 第一個星期的工作日數
+ 末一個星期的工作日數
*/
--計算並返回兩個日期間的工作小時數(工作日*8)按周一到周五計算
--必須先SET DATEFIRST 1
CREATE FUNCTION dbo.CalcWorkHours(@bdate DATETIME, @edate DATETIME)
RETURNS INTEGER
AS BEGIN
DECLARE @hours INTEGER
IF @@DATEFIRST <> 1 OR @bdate > @edate
RETURN -1
SELECT @hours =
--如果終止日期與起始日期在同一個星期內,只需要計算有幾天即可
CASE WHEN DATEPART(wk, @edate-1)-DATEPART(wk,@bdate) = 0 THEN
CASE WHEN DATEPART(dw, @bdate) > 5 THEN 0
WHEN DATEPART(dw, @edate-1) > 5 THEN 6 - DATEPART(dw, @bdate)
ELSE DATEPART(dw, @edate-1) - DATEPART(dw, @bdate) + 1 END
--如果終止日期與起始日期在不同的星期內
--首先計算出除前後兩個星期外完整的星期數 * 5
ELSE (DATEDIFF(dd,@bdate,@edate)
- (8-DATEPART(dw, @bdate))
- DATEPART(dw, @edate-1)) / 7 * 5
--再加上第一個星期里的工作日數
+ CASE WHEN DATEPART(dw, @bdate) < 6 THEN 6 - DATEPART(dw, @bdate)
ELSE 0 END
--加上末一個星期里的工作日數
+ CASE WHEN DATEPART(dw, @edate-1)>5 THEN 5 ELSE DATEPART(dw, @edate-1) END
END * 8
RETURN @hours
END
I. SQL語句計算兩個日期之間有多少個工作日
EXCEL怎麼自動計算出兩個日期之間相隔幾個工作日的解決方法如下: 1、用公式可以:=NETWORKDAYS(a1,b1,"2012-5-1"), 2、節假日要自己手動列出來, 3、NETWORKDAYS函數要安裝了「分析工具箱」之後才能使用。
J. 如何使用sql語句計算工作日(除去周六周日以及法定節假日)
最多隻能除去周六周日,法定假日是自己國家規定的,需要單獨處理的親。