Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sql server中添加定期员工假期_Sql_Sql Server 2008 R2_Datediff_Dateadd_Recurring Events - Fatal编程技术网

在sql server中添加定期员工假期

在sql server中添加定期员工假期,sql,sql-server-2008-r2,datediff,dateadd,recurring-events,Sql,Sql Server 2008 R2,Datediff,Dateadd,Recurring Events,我目前在SQL server中有此表: PL\u ID用户\u ID日志\u日期超时\u时间内\u时间原因详细信息 PL代表人。。。然后您就有了用户ID、登录日期(休息日)、超时、及时、原因和详细信息。。。有一个ASP前台,允许用户将他们的休息日添加到其他人编写的表中。。。目前,用户自己能够做到这一点不是一个问题,但是,我已经被赋予了任务,为明年增加员工休息日。。。。他们经常休假(每周一下午1-3点)或(每周四2-5点)。。。必须有一种更简单的方法来做到这一点,而不是一次只放一天假。我尝试过da

我目前在SQL server中有此表:

PL\u ID用户\u ID日志\u日期超时\u时间内\u时间原因详细信息

PL代表人。。。然后您就有了用户ID、登录日期(休息日)、超时、及时、原因和详细信息。。。有一个ASP前台,允许用户将他们的休息日添加到其他人编写的表中。。。目前,用户自己能够做到这一点不是一个问题,但是,我已经被赋予了任务,为明年增加员工休息日。。。。他们经常休假(每周一下午1-3点)或(每周四2-5点)。。。必须有一种更简单的方法来做到这一点,而不是一次只放一天假。我尝试过dateadd,但我无法找出将其包含在插入中的语法。。。有一天我打算把它添加到用户页面,但现在我只需要让他们休息几天就可以了!很抱歉有点吹牛,但我对这一点非常陌生,如果我没有找到一个简单的方法来插入休息日,我将不得不在下一年每周手动执行

提前谢谢各位


Tom。

如果您有一个主日期表,您可以简单地查询下一年的星期一和星期四的表,并可以使用Insert Select。。。语法

DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
SET @StartDate = '1/1/2013'
SET @EndDate = '12/31/2013'

INSERT INTO DestinationTable(Date,StartTime,EndTime)
SELECT DM.Date,
       CASE WHEN DATENAME(dw,DM.Date) = 'Thursday' THEN '1400'
            WHEN DATENAME(dw,DM.Date) = 'Monday' THEN '1300'
        END AS StartTime,
        CASE WHEN DATENAME(dw,DM.Date) = 'Thursday' THEN '1700'
            WHEN DATENAME(dw,DM.Date) = 'Monday' THEN '1500'
        END AS EndTime     
  FROM DateMaster DM
 WHERE DM.Date Between @StartDate AND @EndDate
   AND DATENAME(dw,DM.Date) IN ('Thursday','Monday')
但是,如果您没有主日期表,那么我们可以循环整个年份并填写该表

DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
DECLARE @DateVar DateTime

SET @StartDate = '1/1/2013'
SET @EndDate = '12/31/2013'
SET @DateVar = @StartDate

WHILE @DateVar <= @EndDate
BEGIN 
     INSERT INTO DestinationTable(Date,StartTime,EndTime)
     SELECT @DateVar,
            CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN '1400'
                 WHEN DATENAME(dw,@DateVar) = 'Monday' THEN '1300'
             END AS StartTime,
            CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN '1700'
                 WHEN DATENAME(dw,@DateVar) = 'Monday' THEN '1500'
             END AS EndTime      
      WHERE DATENAME(dw,@DateVar) IN ('Thursday','Monday')

     SET @DateVar = DATEADD(d,1,@DateVar)
 END
DECLARE@StartDate-DateTime
声明@EndDate-DateTime
声明@DateVar DateTime
设置@StartDate='1/1/2013'
设置@EndDate='12/31/2013'
设置@DateVar=@StartDate

虽然@DateVar,但您确实不应该在
之间(实际上)使用日期/时间值,尤其是在SQL Server中(因为某些日期/时间特性)。如果没有日期表,通常的结果是使用递归CTE生成它(生成一个“虚拟”表),这(可能)比迭代循环要好得多。谢谢大家的快速回复!我将在星期一上午进行测试。我以前有过一些使用case语句的SQL经验,但是数据库结构与我目前所处的环境完全不同。今天早上刚刚看了一下,我相信它会工作的!但是,PL_ID会自动定义并从ASP页面插入。。。我怎样才能让它也包含一个新的PL_ID?再次感谢!PL_ID的数据类型是什么,以及创建新PL_ID的规则是什么。它是表中的标识,还是获得最大值,然后递增和插入,或者它只是一个新的guid?
DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
SET @StartDate = '1/1/2013'
SET @EndDate = '12/31/2013'

;WITH DateMaster(Date)
AS
(
    SELECT @StartDate
     UNION ALL
    SELECT DATEADD(d,1,Date)
      FROM DateMaster
     WHERE DATEADD(d,1,Date) <= @EndDate 
    )


INSERT INTO DestinationTable(Date,StartTime,EndTime)
SELECT DM.Date,
       CASE WHEN DATENAME(dw,DM.Date) = 'Thursday' THEN '1400'
            WHEN DATENAME(dw,DM.Date) = 'Monday' THEN '1300'
        END AS StartTime,
        CASE WHEN DATENAME(dw,DM.Date) = 'Thursday' THEN '1700'
            WHEN DATENAME(dw,DM.Date) = 'Monday' THEN '1500'
        END AS EndTime     
  FROM DateMaster DM
 WHERE DM.Date >= @StartDate AND DM.Date <= @EndDate
   AND DATENAME(dw,DM.Date) IN ('Thursday','Monday')
OPTION (MAXRECURSION 366)