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语句计算工作日(除去周六周日以及法定节假日)
最多只能除去周六周日,法定假日是自己国家规定的,需要单独处理的亲。