2011-06-14 74 views
1

我有這個sql存儲過程應該查看某個表並根據日期列返回作業編號。除了星期六上午運行時(除了返回所有星期五的工作號以外,還應返回所有工作號)。有什麼建議麼?這裏有沒有我看到的邏輯問題?我該如何跟蹤這件事?SQL查詢錯誤不會返回星期五的值

存儲過程

ALTER Procedure [dbo].[JC_GetJobsClosedYesterday] 

As 

SELECT [JobNumber] 
    FROM [NCLGS].[dbo].[JobClosedDate] 
    Where LastInvoiceDate between dbo.ufn_StartOfDay (DATEADD(d, -1, GETDATE())) AND dbo.ufn_StartOfDay (GETDATE()) 
    order by JobNumber desc 

和日間功能的啓動。編輯:我沒有遇到我的日期轉換(除非它不知道如何處理星期五)的麻煩。我需要返回no行部分的幫助。

示例數據:

JobNumber LastInvoiceDate    DayOfWeek 
112117  2011-06-13 00:00:00.000  Monday 
112089  2011-06-10 00:00:00.000  Friday 
112090  2011-06-10 00:00:00.000  Friday 
112068  2011-06-10 00:00:00.000  Friday 
112082  2011-06-10 00:00:00.000  Friday 

更新:現在我真的很困惑。這個「星期五沒有數據」的事情已經發生了(上週五再次發生),但我仍然無法弄清楚。 GETDATE()可能不會返回我認爲它返回的內容嗎?因爲當我根據@ Thomas的建議嘗試進行以下修改時,兩種方法都會獲取數據,但是基於此代碼生成的報告最後沒有數據。

DECLARE @date datetime 
--SET @date = '2011-06-21 13:42:27.257' 
SET @date = '2011-06-11 03:42:27.257' 

--Original Code 
SELECT [JobNumber] 
    FROM [NCLGS].[dbo].[JobClosedDate] 
    Where LastInvoiceDate between dbo.ufn_StartOfDay (DATEADD(d, -1, @date)) AND dbo.ufn_StartOfDay (@date) 
    order by JobNumber desc 

    --Returns 21 records 

--Modified based on @Thomas suggestion 
Select [JobNumber] 
From [NCLGS].[dbo].[JobClosedDate] 
Where LastInvoiceDate >= DateAdd(d, DateDiff(d, 0, @date) - 1, 0) 
    And LastInvoiceDate < DateAdd(d, DateDiff(d, 0, @date), 0) 
Order By JobNumber Desc 

    --Returns 21 records 
+0

爲什麼不能使用CONVERT(varchar,getdate(),101) – THEn 2011-06-14 17:48:56

+0

@THEn - 沒有理由。這是我繼承的代碼。 – MAW74656 2011-06-14 17:50:45

+1

陶氏你有樣品數據至少有一行沒有顯示.... – THEn 2011-06-14 17:55:24

回答

0

其更新jobclosed表的過程是從週一,週二,週三,週四,週五&早晨。它不會在星期六運行,所以直到星期一纔會插入記錄,此時它們將不會被我的存儲過程檢索到。我會安排更新工作在星期六運行。

我加入了select語句之前如下:

if datepart(dw, GETDATE()) = 7 OR datepart(dw, GETDATE()) = 1 
    BEGIN 
     Exec dbo.NCL_MaintainJobClosedDateTable 
     --Select 'True' 
    END 

這將迫使在週六和週日上午的最新情況。

5

而不是DATEADD(d, -1, GETDATE())你應該使用一個表達式返回前一天的開始。你可以使用你的dbo.ufn_StartOfDay()函數,該函數,但有更簡單的方法做同樣的:

Select @DayStart = DateAdd(d, DateDiff(d, 0, @inDate), 0) 

這意味着:由零時間戳和給定的一個之間的全部天數的增加零時間戳。

我也建議使用表達,而不是已經存在的調用函數一樣,所以您的查詢將是:

Select [JobNumber] 
From [NCLGS].[dbo].[JobClosedDate] 
Where LastInvoiceDate Between DateAdd(d, DateDiff(d, 0, GetDate()) - 1, 0) 
          And DateAdd(d, DateDiff(d, 0, GetDate()),  0) 
Order By JobNumber Desc 

加成

你需要更清楚問題出在哪裏。下面是我創建了一個簡單的查詢該測試從週四,6月9日至週六6月18日在該日起你希望得到的值,但沒有或簽證每次約會反之亦然:

With SampleData As 
    (
    Select 112117 As JobNumber, '2011-06-13 00:00:00.000' As LastInvoiceDate, 'Monday' As DayOfWeek 
    Union All Select 112089, '2011-06-10 00:00:00.000', 'Friday' 
    Union All Select 112090, '2011-06-10 00:00:00.000', 'Friday' 
    Union All Select 112068, '2011-06-10 00:00:00.000', 'Friday' 
    Union All Select 112082, '2011-06-10 00:00:00.000', 'Friday' 
    ) 
    , TestDates As 
    (
    Select Cast('20110609' As datetime) As Date 
    Union All 
    Select DateAdd(d,1,Date) 
    From TestDates 
    Where Date <= '20110617' 
    ) 
Select TD.Date, DateName(dw,TD.Date), Count(SD.JobNumber) 
From TestDates As TD 
    Left Join SampleData As SD 
     On SD.LastInvoiceDate Between DateAdd(d, DateDiff(d, 0, TD.Date) - 1, 0) 
          And DateAdd(d, DateDiff(d, 0, TD.Date),  0) 

Group By TD.Date 

更新

在看你的意見和代碼,我認爲這個問題是在你使用BetweenCol Between DateA And DateB轉換爲Col >= DateA And Col <= DateB。即包含兩個端點。相反,您需要排除最後的終點:

Select [JobNumber] 
From [NCLGS].[dbo].[JobClosedDate] 
Where LastInvoiceDate >= DateAdd(d, DateDiff(d, 0, GetDate()) - 1, 0) 
    And LastInvoiceDate < DateAdd(d, DateDiff(d, 0, GetDate()), 0) 
Order By JobNumber Desc 

這會給你所有在前一天的工作號碼。一世。e,如果今天是2011年6月10日星期五,它會給你所有從2011-06-09 midnight2011-06-09 23:59:59的LastInvoiceDate值。

+0

@Thomas @Andriy - 我明白你的意思,但是當我傳遞函數GETDATE()時,它會返回正確的日期時間:'2011-06-14 00:00:00.000' – MAW74656 2011-06-14 20:48:05

+0

@ MAW74656 - 沒關係。您希望將SQL今天的日期作爲實際的DateTime,以便您可以對其進行數學運算。如果您試圖將今天的日期作爲值返回,請按原樣返回,並在報表或輸出(例如Excel)中格式化。 – Thomas 2011-06-14 20:55:59

+0

@托馬斯 - 我很抱歉,但我不明白。你是說根據數學要求我的代碼看起來不錯? – MAW74656 2011-06-15 13:56:28

0

Floor a date in SQL server參見

若要去除時間部分使用:

SELECT CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS float)) AS DATETIME) 

這應該是最快的方法。因此

SELECT [JobNumber] 
    FROM [NCLGS].[dbo].[JobClosedDate] 
    WHERE LastInvoiceDate between 
     CAST((FLOOR(CAST(GETDATE() float))-1.0) AS DATETIME) AND 
     CAST(FLOOR(CAST(GETDATE() AS float)) AS DATETIME) 
    ORDER BY JobNumber DESC 
+0

問題不在於剝離時間部分。這是一個沒有問題的解決方案。 – MAW74656 2011-06-21 16:28:09

+0

@ MAW7465 - 你讓我...你的問題沒有問題 - 測試數據到底是什麼,你不期待什麼結果? – Hogan 2011-06-22 04:01:16