【发布时间】:2014-01-23 16:54:21
【问题描述】:
我有一张这样的桌子:
EMP:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7934 MILLER CLERK 7782 01/23/1982 1300 - 10
7369 SMITH CLERK 7902 12/17/1980 800 - 20
7521 WARD SALESMAN 7698 02/22/1981 1250 500 30
7654 MARTIN SALESMAN 7698 09/28/1981 1250 1400 30
7698 BLAKE MANAGER 7839 05/01/1981 2850 - 30
7782 CLARK MANAGER 7839 06/09/1981 2450 - 10
7839 KING PRESIDENT - 11/17/1981 5000 - 10
7844 TURNER SALESMAN 7698 09/08/1981 1500 - 30
7499 ALLEN SALESMAN 7698 02/20/1981 1600 300 30
7566 JONES MANAGER 7839 04/02/1981 2975 - 20
7788 SCOTT ANALYST 7566 12/09/1982 3000 - 20
7876 ADAMS CLERK 7788 01/12/1983 1100 - 20
7900 JAMES CLERK 7698 12/03/1981 950 - 30
7902 FORD ANALYST 7566 12/03/1981 3000 - 20
如果在任何一个月的 15 日或之前雇用的员工在该月的最后一个星期五支付工资,那么在 15 日之后雇用的员工将在下个月的第一个星期五支付工资。打印一份 emps 列表以及他们的雇佣日期和支付日期。
在 oracle 中我们可以通过简单的查询来实现。谁能建议我简单的 SQL Server 查询来显示所需的结果。
这是我在 SQL Server 中尝试过的以下代码,
SELECT *,CASE WHEN DATEPART(DD,HIREDATE)<=15
THEN (CASE WHEN DATENAME(WEEKDAY,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))),DATEADD(mm,1,HIREDATE))))='MONDAY'
THEN DATEADD(DD,-4,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))),DATEADD(mm,1,HIREDATE))))
WHEN DATENAME(WEEKDAY,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))),DATEADD(mm,1,HIREDATE))))='TUESDAY'
THEN DATEADD(DD,-3,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))),DATEADD(mm,1,HIREDATE))))
WHEN DATENAME(WEEKDAY,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))),DATEADD(mm,1,HIREDATE))))='WEDNESDAY'
THEN DATEADD(DD,-5,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))),DATEADD(mm,1,HIREDATE))))
WHEN DATENAME(WEEKDAY,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))),DATEADD(mm,1,HIREDATE))))='THURSDAY'
THEN DATEADD(DD,-6,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))),DATEADD(mm,1,HIREDATE))))
WHEN DATENAME(WEEKDAY,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))),DATEADD(mm,1,HIREDATE))))='FRIDAY'
THEN DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))),DATEADD(mm,1,HIREDATE))
WHEN DATENAME(WEEKDAY,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))),DATEADD(mm,1,HIREDATE))))='SATURDAY'
THEN DATEADD(DD,-1,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))),DATEADD(mm,1,HIREDATE))))
WHEN DATENAME(WEEKDAY,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))),DATEADD(mm,1,HIREDATE))))='SUNDAY'
THEN DATEADD(DD,-2,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))),DATEADD(mm,1,HIREDATE))))
END)
ELSE CASE
WHEN DATENAME(WEEKDAY,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))-1),DATEADD(mm,1,HIREDATE))))='MONDAY'
THEN DATEADD(DD,2,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))-1),DATEADD(mm,1,HIREDATE))))
WHEN DATENAME(WEEKDAY,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))-1),DATEADD(mm,1,HIREDATE))))='TUESDAY'
THEN DATEADD(DD,4,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))-1),DATEADD(mm,1,HIREDATE))))
WHEN DATENAME(WEEKDAY,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))-1),DATEADD(mm,1,HIREDATE))))='WEDNESDAY'
THEN DATEADD(DD,3,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))-1),DATEADD(mm,1,HIREDATE))))
WHEN DATENAME(WEEKDAY,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))-1),DATEADD(mm,1,HIREDATE))))='THURSDAY'
THEN DATEADD(DD,1,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))-1),DATEADD(mm,1,HIREDATE))))
WHEN DATENAME(WEEKDAY,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))-1),DATEADD(mm,1,HIREDATE))))='FRIDAY'
THEN DATEADD(DD,0,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))-1),DATEADD(mm,1,HIREDATE))))
WHEN DATENAME(WEEKDAY,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))-1),DATEADD(mm,1,HIREDATE))))='SATURDAY'
THEN DATEADD(DD,6,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))-1),DATEADD(mm,1,HIREDATE))))
WHEN DATENAME(WEEKDAY,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))-1),DATEADD(mm,1,HIREDATE))))='SUNDAY'
THEN DATEADD(DD,5,(DATEADD(dd,-(DAY(DATEADD(mm,1,HIREDATE))-1),DATEADD(mm,1,HIREDATE))))
END
END
FROM EMP;
上述查询按预期工作,但我正在寻找一种简单的方法来实现这一点..... :)
【问题讨论】:
-
在获得任何帮助之前,我们需要先看看您首先尝试了什么。
-
嗨@RaduGheorghiu 查看我的查询
标签: sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2