【发布时间】:2014-09-29 23:16:30
【问题描述】:
我正在编写一个存储过程(用于 SQL Server 2012),该过程应该计算每个月 16 日至 15 日员工的小时数。
我有以下数据库结构
我已经编写了一个存储过程来计算小时数,但我认为我只能获取星期开始日期来过滤我的条件。存储过程返回了错误的结果,因为每周的开始日期并不总是 16 号。
CREATE PROCEDURE [dbo].[spGetTotalHoursBetween16to15EveryMonth]
AS
BEGIN
SET NOCOUNT ON
BEGIN TRY
DECLARE @SixteenthDate datetime2(7) = DATEADD(DAY, 15, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0))
DECLARE @currentDate datetime2(7) = getDate()
DECLARE @LastSixteenthDate datetime2(7) = DATEADD(DAY, 15, DATEADD(MONTH, DATEDIFF(MONTH, 0, DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) - 1, 0)), 0))
IF(@currentDate >= @SixteenthDate)
BEGIN
SELECT
(Sum(Day1Hours) + sum(Day2Hours) + Sum(Day3Hours) +
sum(Day4Hours) + Sum(Day5Hours) + sum(Day6Hours) + Sum(Day7Hours)) AS Total
FROM
dbo.TimeSheets
WHERE
WeekStartDate BETWEEN DATEADD(wk, DATEDIFF(wk, 0, @SixteenthDate), -1) AND @currentDate
END
ELSE
BEGIN
SELECT
(Sum(Day1Hours) + sum(Day2Hours) + Sum(Day3Hours) +
sum(Day4Hours) + Sum(Day5Hours) + sum(Day6Hours) + Sum(Day7Hours)) AS Total
FROM
dbo.TimeSheets
WHERE
WeekStartDate BETWEEN DATEADD(wk, DATEDIFF(wk, 0, @LastSixteenthDate), -1) AND @currentDate
END
END TRY
BEGIN CATCH
THROW
END CATCH
END
【问题讨论】:
-
为什么这被标记为 ASP.Net?
-
旁注:如果你使用
DATETIME2(7)(这是一个好的东西!),那么你应该开始使用SYSDATETIME()而不是GETDATE()在您的“当前日期”上获得与其他任何时间相同的准确性。
标签: sql sql-server sql-server-2008 tsql stored-procedures