2013-05-07 65 views
1

我正在嘗試返回上個月已完成標記的所有記錄的計數。列名稱是他的日期時間字段。這是我需要確保記錄在上個月完成的相同領域。Sql Server,如何返回記錄上個月蓋章的結果?

這是我

SELECT count(*) 
FROM PhoneCall AS p WITH (nolock) 
WHERE (p.actualend >= CAST(CONVERT(varchar(8), DATEADD(dd, - (DAY(DATEADD(mm, 1, GETDATE())) - 1), DATEADD(mm, - 1, GETDATE())), 1) AS datetime)) 
    AND (p.actualend <= CAST(CONVERT(varchar(8), DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0)), 1) AS datetime)) 

這個代碼給我略高結果(總成績我得到它847)

但是,如果我運行此代碼

SELECT count(*) 
FROM PhoneCall AS p WITH (nolock) 
WHERE p.actualend BETWEEN '03/01/2013 00:00:00' AND '03/31/2013 23:59:59' 

我得到共有843條記錄。 如何糾正我的第一個查詢以獲得兩個查詢中的相同總數?

謝謝

回答

1

您的第一個查詢並沒有在最後一天獲得所有記錄的完整記錄。這是因爲最後一天的計算會在上午12:00:00返回正確的日期。你想要的時間部分是11:59:59 PM。

爲了測試在查詢我跑了select語句,看看前一個月的第一天和最後一天的計算是邏輯:

select CAST(CONVERT(varchar(8), DATEADD(dd, - (DAY(DATEADD(mm, 1, GETDATE())) - 1), DATEADD(mm, - 1, GETDATE())), 1) AS datetime) 
select CAST(CONVERT(varchar(8), DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0)), 1) AS datetime) 

的結果2013-04-01 00:00:00.0002013-04-30 00:00:00.000。 (基於當前日期5/7/2013)

我推薦計算當前月份的第一天而不是上個月的最後一天,然後執行<比較,而不是比較<=。然後,如果錄製的內容在當天的最後幾個毫秒內完成標記,則不必處理會發生什麼情況。

我在下面修改了您的原始查詢,在計算月底時加上1天 - 有效計算當月的第一天。然後我將比較運算符更改爲1而不是<=。你可能可以改進這個計算,但這只是一個快速而簡單的方法來展示一個邏輯的例子。

SELECT count(*) 
FROM PhoneCall AS p WITH (nolock) 
WHERE (p.actualend >= CAST(CONVERT(varchar(8), DATEADD(dd, - (DAY(DATEADD(mm, 1, GETDATE())) - 1), DATEADD(mm, - 1, GETDATE())), 1) AS datetime)) 
    AND (p.actualend < CAST(CONVERT(varchar(8), DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0)), 1) AS datetime) + 1) 
+0

謝謝亞當讓我走向正確的道路。這是我所做的,它的工作p.actualend CAST(CONVERT(varchar(8),DATEADD(dd, - (DAY(DATEADD(mm,1,GETDATE())) - 1),DATEADD(mm, - 1,GETDATE()))1)AS datetime AND CAST(DATEADD(s,86399,CONVERT(varchar(8),DATEADD(s,-1,DATEADD(mm,DATEDIFF(m,0,GETDATE() ),0)),1))AS datetime) – Mike 2013-05-07 22:43:45

1

Adam有一個正確的答案。不過,我認爲可以通過這種方式來使其更容易理解。

在兩個日期之間選擇數據的要點是使用這個邏輯,這是Adam的第二個查詢。

where YourField >= @StartDate 
and YourField < the day after @EndDate 

如果您呼叫從一個應用程序(.NET,PHP,ColdFusion的,等等)這個查詢,它可能是簡單的應用程序中創建這些變量並將它們作爲參數。否則,你可能想要做這樣的事情:

declare @EndDate as datetime; 
    declare @StartDate as datetime; 

    set @EndDate = CAST(CONVERT(varchar(8) 
    , DATEADD(dd, - (DAY(DATEADD(mm, 1, GETDATE())) - 1) 
, DATEADD(mm, 0, GETDATE())), 1) AS datetime); 

set @StartDate = DateAdd(month, -1, @EndDate); 

SELECT count(*) 
FROM lassqls1.CareCredit_MSCRM.dbo.PhoneCall AS p WITH (nolock) 
WHERE p.actualend >= @StartDate 
and p.actualend < @EndDate 
相關問題