2015-06-26 60 views
0

我想知道是否有人可以幫我解決我的困境,我有一塊SQL,它必須返回一定的金額在當前時間行中,開始日期必須爲2014-03-01,結束日期2015-03-01。現在棘手的部分是,它應該每年都會自動更改,所以我不必更改它,例如明年應該是2015-03-012016-03-01如何獲得某一個月和一天的上一年的日期......當前年度的反之亦然

我寫的SQL:

SELECT c.Name AS Biller,SUM(TotalTransactions) AS TotalTransactions, 
    SUM([email protected])/1.14 AS [email protected] 
FROM [email protected] d 
LEFT OUTER JOIN [email protected] c (nolock) ON d.ClientID = c.RecID 
WHERE Name = 'Name of Biller' 
AND DateCreated >= 'start date' --2014-03-01 
AND DateCreated < 'end date' -- 2015-03-01 
GROUP BY c.Name 
ORDER BY c.Name Asc 
+2

哪個SQL版本?在2012年,您可以使用DATEFROMPARTS輕鬆創建日期 –

+0

您如何確定月份?它是當前月份還是調用者指定它? –

+0

你的問題是什麼?我沒有得到你,你能指定什麼是預期的輸出 –

回答

0

下應該給你你需要的日期:

SELECT YearStart = CAST(CAST(
          DATEPART(YEAR, GETDATE()) - 
           CASE WHEN DATEPART(MONTH, GETDATE()) < 3 
            THEN -1 
            ELSE 0 
           END AS VARCHAR(4)) + '0301' AS DATE), 
     YearEnd = CAST(CAST(
          DATEPART(YEAR, GETDATE()) - 
           CASE WHEN DATEPART(MONTH, GETDATE()) < 3 
            THEN 0 
            ELSE 1 
           END AS VARCHAR(4)) + '0301' AS DATE); 

原則是獲得一年,然後添加'0301'(3月1日)來獲得你的日期。然後你只需要運用一些邏輯來獲得正確的年份,如果日期是二月份的一月份,那麼你需要從一年中扣除一份以獲得前一年的3月份。

+0

謝謝你,這個人工作 – Noobling

0

這將上年讓你運行查詢時。

datepart(Year,dateadd(YEAR,-1,GetDate())) 

這應該做你所需要的。

dateadd(YEAR,-1,'2015-03-03') 

只需將'2015-03-03'替換爲您的日期列,即可爲您提供開始日期。

這裏是它的外觀在您的查詢

SELECT c.Name AS Biller,SUM(TotalTransactions) AS TotalTransactions, 
    SUM([email protected])/1.14 AS [email protected] 
FROM [email protected] d 
LEFT OUTER JOIN [email protected] c (nolock) ON d.ClientID = c.RecID 
WHERE Name = 'Name of Biller' 
AND dateadd(YEAR,-1,DateCreated) >= 'start date' --2014-03-01 
AND DateCreated < 'end date' -- 2015-03-01 
GROUP BY c.Name 
ORDER BY c.Name Asc 
+1

將函數應用於字段可防止優化器使用索引。將函數應用於開始日期和結束日期會更好(也更容易) –

+0

我不確定我是否理解您應用於開始日期和結束日期而不是列的含義。你能解釋一下嗎,我對此感興趣。 –

+0

@PanagiotisKanavos好點! – CeOnSql

0

它並不漂亮,但它應該工作:

SELECT c.Name AS Biller,SUM(TotalTransactions) AS TotalTransactions, 
    SUM([email protected])/1.14 AS [email protected] 
FROM [email protected] d 
LEFT OUTER JOIN [email protected] c (nolock) ON d.ClientID = c.RecID 
WHERE Name = 'Name of Biller' 
AND DateCreated >= CAST(CAST(YEAR(GETDATE()-1) AS VARCHAR(4)) + '-03-01' AS DATE) 
AND DateCreated < CAST(CAST(YEAR(GETDATE()) AS VARCHAR(4)) + '-03-01' AS DATE) 
GROUP BY c.Name 
ORDER BY c.Name Asc 

編輯: 數據類型只DATE作品SQL Server 2008或更高版本,如果你'重新運行以前的版本,請改用DATETIME

0

您可以使用下面的查詢,以獲得變開始和結束日期的值,然後在查詢中使用的值:

DECLARE @year INT = Datepart(YEAR, getdate()) 
DECLARE @month INT = 3 
DECLARE @day INT = 01 
DECLARE @EndDate datetime 
DECLARE @StartDate datetime 

SELECT @StartDate = CAST(CONVERT(VARCHAR, @year - 1) + '-' + CONVERT(VARCHAR, @month) + '-' + CONVERT(VARCHAR, @day) AS DATETIME) 
SELECT @endDate = CAST(CONVERT(VARCHAR, @year) + '-' + CONVERT(VARCHAR, @month) + '-' + CONVERT(VARCHAR, @day) AS DATETIME) 

select @StartDate as [StartDate], @endDate as [EndDate] 
相關問題