sql sqlserver查询语句几个工作日之后的日期

CREATE TABLE [dbo].[DicDate]([ID] [int] IDENTITY(1,1) NOT NULL,[DateStr] [smalldatetime] NULL,
CONSTRAINT [PK_DicDate] PRIMARY KEY CLUSTERED
)WITH (PAD_INDEX
= OFF, STATISTICS_NORECOMPUTE
= OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS
= ON, ALLOW_PAGE_LOCKS
= ON) ON [PRIMARY]
) ON [PRIMARY]GO
declare @datetime smalldatetime,@weekday char(6)
set @datetime=''
while @datetime&=''
select @weekday=datename(weekday,@datetime)
if @weekday= '星期六'
insert into DicDate([DateStr]) values(@datetime)
if @weekday='星期日'
insert into DicDate([DateStr]) values(@datetime)
select @datetime=dateadd(day,1,@datetime)
****************************************************************************
declare @t table(dd datetime)
declare @d1 datetime
select @d1=''
while(year(@d1) &2008)
insert into @t select @d1
set @d1=dateadd(dd,1,@d1)
select * from @t where datepart(weekday,dd)=6 or datepart(weekday,dd)=7
****************************************************************************declare @i int declare @d datetime set @i=1set @d=''Create table #a (Dat datetime)while year(@d)=2007
insert into #a values (@d )
set @i=@i+1
set @d=dateadd(day,1,@d)
end select *,datepart(dw,Dat) as a from #a where
datepart(dw,Dat) =1 or datepart(dw,Dat) =7
****************************************************************************/*
功能: 计算在某一段时间内某周几(如星期一)的所有日期
设计:OK_008
时间:2006-10*/DECLARE @Date datetimeDECLARE @StartDate datetimeDECLARE @EndDate datetimeDECLARE @WeekDay intDECLARE @i intSET DATEFIRST 7 --设置每周的第一天 SET @StartDate='' --统计的开始日期SET @EndDate='' --统计的结束日期SET @WeekDay=1 --根据实际的@@DATEFIRST而定,一般默认是7,如
@StartDate=''时候, @WeekDay=3表示星期二SET @i=DATEPART(weekday,@StartDate)PRINT '每周的第1天设置@@DATEFIRST: '+CAST(@@DATEFIRST AS nvarchar(1))PRINT '开始日期对应一周的第几天: '+CAST(@i AS nvarchar(1))IF(@i&=@WeekDay AND @i&7)SET @i=@WeekDay-@i ELSE IF(@i&=@WeekDay AND @i=7)SET @i=@i-@WeekDayELSESET @i=@@DATEFIRST-@i+@WeekDaySET @Date=DATEADD(day,@i,@StartDate)WHILE @Date&=@EndDate BEGINIF(@StartDate&=@Date) PRINT CONVERT(nvarchar(10),@Date,121)SET @Date=DATEADD(Week,1,@Date)ENDGO/* ==============运行结果================*//*
每周的第1天设置@@DATEFIRST: 7
开始日期对应一周的第几天: 1
..........*/select dateadd(day,x,col),'星期二' from
(select cast('' as datetime) as col
)a cross join
(SELECT top 365 b8.i+b7.i + b6.i + b5.i + b4.i +b3.i +b2.i + b1.i + b0.i
xFROM(SELECT 0 i UNION ALL SELECT 1)
b0CROSS JOIN(SELECT 0 i UNION ALL SELECT 2)
b1CROSS JOIN(SELECT 0 i UNION ALL SELECT 4)
b2CROSS JOIN(SELECT 0 i UNION ALL SELECT 8)
b3CROSS JOIN(SELECT 0 i UNION ALL SELECT 16)
b4CROSS JOIN(SELECT 0 i UNION ALL SELECT 32)
b5CROSS JOIN(SELECT 0 i UNION ALL SELECT 64)
b6CROSS JOIN(SELECT 0 i UNION ALL SELECT 128)
b7CROSS JOIN(SELECT 0 i UNION ALL SELECT 256)
b8order by 1
)bwhere datepart(dw,dateadd(day,x,col))=3 (这个地方改值换取其他日期)2006-01-03 00:00:00.000
星期二2006-01-10 00:00:00.000
星期二2006-01-17 00:00:00.000
星期二2006-01-24 00:00:00.000
星期二2006-01-31 00:00:00.000
****************************************************************************
DECLARE @t TABLE(date0 DATETIME)
DECLARE @st DATETIME,@et DATETIME
SET @st=''
SET @et=''
WHILE @st &@et
INSERT INTO @t VALUES(@st)
SELECT @st=DATEADD(DAY,1,@st)
SELECT date0,DATENAME(weekday,date0) FROM @t WHERE DATEPART(weekday,date0+@@DATEFIRST-1) IN (6,7)
****************************************************************************
由于工作需要,在SQL Server 2005 下面写了一个计算两个日期之间相差工作日的函数。函数是以一个星期5天工作日计算,没有剔除五一国庆等假期。代码如下:
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
-- =============================================
-- Author:
-- Create date:
-- Description: 计算两个日期之间相差的工作日
-- =============================================
ALTER FUNCTION [dbo].[WorkDatediff]
@begin_date datetime,
@end_date datetime
RETURNS int
DECLARE @return_date_quantity int
DECLARE @temp datetime
DECLARE @week_quantity int
DECLARE @day_quantity int
DECLARE @begin_day_of_week int
DECLARE @end_day_of_week int
DECLARE @add_begin_day_quantity int
DECLARE @add_end_day_quantity int
set @day_quantity = Datediff(d,@begin_date,@end_date)
--判断传入的开始日期是否比结束日期大
if @day_quantity & 0
set @temp = @begin_date
set @begin_date = @end_date
set @end_date = @temp
set @week_quantity = Abs(Datediff(ww,@begin_date,@end_date)) - 1
if @week_quantity & 0
set @week_quantity = 0
set @begin_day_of_week = Datepart(dw,@begin_date) - 1
set @end_day_of_week = Datepart(dw,@end_date) - 1
set @add_begin_day_quantity = case
when @begin_day_of_week & 5 then 0
else 6 - @begin_day_of_week --(5 - @begin_day_of_week + 1)
set @add_end_day_quantity = case
when abs(@day_quantity) & 8
when @end_day_of_week & 5 then 5
else @end_day_of_week
if @day_quantity = 0
set @return_date_quantity = 0
set @return_date_quantity = @week_quantity * 5 + @add_begin_day_quantity + @add_end_day_quantity
if @day_quantity & 0
set @return_date_quantity = @return_date_quantity * -1
RETURN @return_date_quantity
SET ANSI_NULLS OFF
SET QUOTED_IDENTIFIER OFF
Original text:http://www.cnblogs.com/wayne-ivan/archive//1146308.html
SQL输出周末日期
SQL Server如何去判断当天是否为星期天
判断是工作日还是周末的SQL语句
在sql server中实现查找一个月中有多少星期天
mysql 获取当前日期周一和周日
sqlserver 获取星期一到星期日的数据
SQL中CASE语句判断星期几
SQL数据库取一年内每月的数据统计
SQL取出 所有周六 周日的日期
sql跳过非工作日(周末和节假日)
没有更多推荐了,简介:场景1:基于开始日期和工期,推算结束日期。 场景2:基于开始日期和结束日期,计算工期 注:需要自己做界面维护工作日表(s_WorkDay)和节假日表(s_SpecialDay)&
涉及到的数据表
IF OBJECT_ID('s_WorkDay') IS NULL
CREATE TABLE s_WorkDay([Monday] [TINYINT]
,[Tuesday] [TINYINT]
,[Wednesday] [TINYINT]
,[Thursday] [TINYINT]
,[Friday] [TINYINT]
,[Saturday] [TINYINT]
,[Sunday] [TINYINT]
IF OBJECT_ID('s_SpecialDay') IS NULL
CREATE TABLE s_SpecialDay([SpecialDayGUID] [UNIQUEIDENTIFIER] PRIMARY KEY CLUSTERED NOT NULL
,[BeginDate] [DATETIME]
,[EndDate] [DATETIME]
,[IsWorkDay] [TINYINT]
,[Remarks] [VARCHAR](200)
场景1:根据开始日期和工期,计算结束日期
--根据开始日期推出结束日期
IF EXISTS ( SELECT
dbo.sysobjects WHERE
id = OBJECT_ID(N'[dbo].[fn_GetEndDate]') AND xtype IN ( N'FN', N'IF', N'TF' ) )
DROP FUNCTION [dbo].[fn_GetEndDate]
FUNCTION fn_GetEndDate ( @date DATETIME,@Duration INT )
RETURNS DATETIME
DECLARE @Edate DATETIME
DECLARE @IsAdd INT
SET @Edate=@date
SET @Duration=@Duration-1
DECLARE @NoWorkDay TABLE(iDay int)
--非工作日枚举
INSERT INTO @NoWorkDay(iDay) SELECT * FROM dbo.fn_NoWorkDay()
WHILE ( @Duration & 0 )
SET @IsAdd=0
--默认往后+1
SET @Edate=DATEADD(day, 1, @Edate)
--如果非工作日,重复循环,否则跳下一步
IF EXISTS( SELECT TOP 1 1 FROM s_workDay WHERE DATEPART(weekday, @Edate) NOT IN (SELECT * FROM @NoWorkDay))
SET @IsAdd=1
SET @Duration = @Duration - 1
--如果当前日期在特殊非工作日中,则不跳
IF EXISTS( SELECT TOP 1 1 FROM s_SpecialDay WHERE (@Edate BETWEEN begindate AND enddate) AND IsWorkDay=0 AND @IsAdd=1)
SET @Duration = @Duration + 1
--如果当前日期在特殊工作日中,则跳1
IF EXISTS( SELECT TOP 1 1 FROM s_SpecialDay WHERE (@Edate BETWEEN begindate and enddate) AND IsWorkDay=1 AND @IsAdd=0)
SET @Duration = @Duration -1
RETURN @Edate
场景2:根据两个日期,计算工期
--计算工期
IF EXISTS ( SELECT
dbo.sysobjects WHERE
id = OBJECT_ID(N'[dbo].[fn_GetDuration]') AND xtype IN ( N'FN', N'IF', N'TF' ) )
DROP FUNCTION [dbo].[fn_GetDuration]
FUNCTION fn_GetDuration(@BeginDate DATETIME,@EndDate DATETIME)
RETURNS INT
DECLARE @iCount INT
--A:取出常规工作日
@iCount = ISNULL(dbo.fn_GetWorkDay(@BeginDate, @EndDate), 0)
--B:减去特殊非工作日
@iCount = @iCount
- ISNULL(SUM(dbo.fn_GetWorkDay(CASE WHEN begindate & @BeginDate
THEN @BeginDate
ELSE begindate
CASE WHEN enddate & @EndDate
THEN @EndDate
ELSE enddate
s_SpecialDay
isworkday = 0
AND SpecialDayGUID NOT IN (
SpecialDayGUID
s_SpecialDay
( begindate & @EndDate
AND enddate & @EndDate
OR ( begindate & @BeginDate
AND enddate & @BeginDate
----C:加上特殊工作日
@iCount = @iCount + ISNULL(SUM(DATEDIFF(dd,
CASE WHEN begindate & @BeginDate
THEN @BeginDate
ELSE begindate
CASE WHEN enddate & @EndDate
THEN @EndDate
ELSE enddate
- dbo.fn_GetWorkDay(CASE
WHEN begindate & @BeginDate
THEN @BeginDate
ELSE begindate
WHEN enddate & @EndDate
THEN @EndDate
ELSE enddate
s_SpecialDay
isworkday = 1
AND SpecialDayGUID NOT IN (
SpecialDayGUID
s_SpecialDay
( begindate & @EndDate
AND enddate & @EndDate
OR ( begindate & @BeginDate
AND enddate & @BeginDate
RETURN @iCount
需要用到的函数
IF EXISTS ( SELECT
dbo.sysobjects
id = OBJECT_ID(N'[dbo].[fn_NoWorkDay]')
AND xtype IN ( N'FN', N'IF', N'TF' ) )
DROP FUNCTION [dbo].[fn_NoWorkDay]
--输出非工作日
FUNCTION fn_NoWorkDay()
RETURNS @NoWorkDay TABLE ( iDay INT )
INTO @NoWorkDay
Monday = 0
INTO @NoWorkDay
Tuesday = 0
INTO @NoWorkDay
Wednesday = 0
INTO @NoWorkDay
Thursday = 0
INTO @NoWorkDay
Friday = 0
INTO @NoWorkDay
Saturday = 0
INTO @NoWorkDay
Sunday = 0
--计算工作日
IF EXISTS ( SELECT
dbo.sysobjects
id = OBJECT_ID(N'[dbo].[fn_GetWorkDay]')
AND xtype IN ( N'FN', N'IF', N'TF' ) )
DROP FUNCTION [dbo].[fn_GetWorkDay]
FUNCTION fn_GetWorkDay(@BeginDate DATETIME,@EndDate DATETIME)
RETURNS INT
DECLARE @NoWorkDay TABLE(iDay int)
--非工作日枚举
INSERT INTO @NoWorkDay(iDay) SELECT * FROM fn_NoWorkDay()
DECLARE @i INT,@iCount INT
SET @iCount=0
SET @i = DATEDIFF(day, @BeginDate, @EndDate)
WHILE ( @i &= 0 )
--如果开始日期往后顺延,遇到非工作日,则不计数
IF EXISTS( SELECT TOP 1 1 FROM s_workDay WHERE DATEPART(weekday, @BeginDate) NOT IN (SELECT * FROM @NoWorkDay))
SET @iCount=@iCount+1
SET @BeginDate=DATEADD(day, 1, @BeginDate)
SET @i = @i - 1
RETURN @iCount
阅读(...) 评论()sql 计算两个时间间隔了几个工作日_百度知道
sql 计算两个时间间隔了几个工作日
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
来自电脑网络类芝麻团
采纳数:652
获赞数:736
参与团队:
SELECT DATEDIFF(D,dateA,dateB)
你好,问题解决了吗?请采纳!谢谢!
为你推荐:
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。在SQL Server中如何将两个日期之间的工作日作为查询条件(转) - 少说话,多做事 - 博客园
可能看标题你还是不太懂我在讲什么,我们设定一个场景,假如一天老板叫你为他统计在06年圣诞节() 至07年情人节()这段时间创建的,处理了超过七天半(7.5个工作日)的客诉的数量,你如何操作呢?&&&&&&& 首先我们说超过7.5个工作日,就是要减去周六和周日后的天数,再者,超过了7.5天,也就是说处理时间有可能是8.4,10.2,13.1等等,诸如此类了。&&&&&&& 以下就是我的处理方法:&&&&&&& 假设数据库里有记录客诉的创建时间(BeginDate)和结束时间(EndDate),我们在查询语句中就可以这样写:&&&&&& Sql = "SELECT ... FROM ... WHERE&BeginDate between '' and '' "&&&&&&&&&&&&&&+" and DATEDIFF(hh,&BeginDate, EndDate) - "&&&&&&&&&&&&& +"(DATEDIFF(day,DATEADD(wk, DATEDIFF(wk,0,BeginDate), 0),getdate())/7"&&&&&&&&&&&&& +" - DATEDIFF(day,DATEADD(wk, DATEDIFF(wk,0,EndDate), 0),getdate())/7)*2*24 〉7.5*24";&&&&&&&&我来分析一下这个查询语句:&&&&&&&&BeginDate between '' and ''&&应该很好理解,提取出规定日期的数据行。&&&&&&&&DATEDIFF(hh, BeginDate, EndDate)&计算两个日期之间总的小时数,为了方便说明,我们这里取个别名叫&A&。注意,这里要换算成为小时,原因你也可以先思考下。^^&&&&&&&&DATEDIFF(day,DATEADD(wk, DATEDIFF(wk,0,BeginDate), 0),getdate())/7的意思是让当前时间去减去创建时间所在星期的星期一的天数,然后再整除7,等到间隔的星期数。我们这里也取个别名叫&B&。&&&&&&& 同理可得,DATEDIFF(day,DATEADD(wk, DATEDIFF(wk,0,EndDate), 0),getdate())/7的意思是让当前时间去减去结束时间所在星期的星期一的天数,然后再整除7,等到间隔的星期数。我们这里也取个别名叫&C&。&&&&&&& 好了,该查询语句的原型就是:&&&&&&&&A - (B-C)*2*24 〉7.5*24&&&&&&& (B-C)*2*24::B-C就是两个时间之间的星期数了,*2*24就是将这些星期换算为小时数,这样才能和A进行计算的。7.5*24原理也是一样。
&&&&&&&&结束语:&&&&&&&&该语句的适用环境是开始时间和结束时间都必须在工作日发生的情况下,毕竟一些事情必须是在工作时才能处理的,而且不能处理特定节假日,例如五一、国庆放假等等,单靠一句SQL的确很难完成所有工作,不过可以将条件进行分类,形成多条SQL,然后用Union将其串起来,这只是我的初步想法,如果你有更优秀的办法,望能交流。^^ & & &&
阅读(...) 评论()SQL语句计算两个日期之间有多少个工作日_百度知道
SQL语句计算两个日期之间有多少个工作日
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
EXCEL怎么自动计算出两个日期之间相隔几个工作日的解决方法如下: 1、用公式可以:=NETWORKDAYS(a1,b1,&&), 2、节假日要自己手动列出来, 3、NETWORKDAYS函数要安装了“分析工具箱”之后才能使用。
为你推荐:
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 sqlserver正版价格 的文章

 

随机推荐