2016-02-21 104 views
1

我需要從當前月份到下一個月份之間的表格中選擇數據。但是我沒有數據中的日期列。日期分爲三部分 - CalDay,CalMonth和CalYear。SQL Server中的日期範圍

我曾嘗試下面的查詢:

SELECT CustomerName, CalDay, CalMonth, CalYear, RequiredHours 
FROM [DLSizingDB].[dbo].[SMTRequiredHours] 
WHERE  
    CalYear >= (SELECT YEAR(GETDATE())) AND 
    CalYear <= (SELECT YEAR(DATEADD(MONTH,12,CURRENT_TIMESTAMP))) AND 
    CalMonth >= (SELECT MONTH(GETDATE())) 
    AND SiteCode = 'MX01' 
ORDER BY CustomerName 

它選擇直到只有2016月的數據。我還需要選擇2017年1月。如何實現這一目標?

樣本數據一年

CustomerName  CalDay  CalMonth  CalYear  RequiredHours 
"ACFG"   1   2   2016  10 
"AZS"   1   3   2016  20 
"AZW"   1   4   2016  20 
"AZG"   1   5   2016  20 
"AZJ"   1   6   2016  20 
"AZL"   1   1   2017  20 

回答

0

此聲明也考慮CalDay。這將選擇日期範圍爲[current_date,current_date +一年)的所有條目。

SELECT CustomerName, CalDay, CalMonth, CalYear, RequiredHours 
FROM [DLSizingDB].[dbo].[SMTRequiredHours] 
WHERE 
    SiteCode = 'MX01' AND (
     calyear=YEAR(GETDATE()) AND (calmonth>MONTH(GETDATE()) OR calmonth=MONTH(GETDATE()) AND calday>=DAY(GETDATE())) OR 
     calyear=YEAR(GETDATE())+1 AND (calmonth<MONTH(GETDATE()) OR calmonth=MONTH(GETDATE()) AND calday< DAY(GETDATE())) 
    ) 
ORDER BY CustomerName; 

在SQL Server 2012+可以使用DATEFROMPARTS

SELECT CustomerName, CalDay, CalMonth, CalYear, RequiredHours 
FROM [DLSizingDB].[dbo].[SMTRequiredHours] 
WHERE 
    SiteCode = 'MX01' AND 
    DATEFROMPARTS(calyear,calmonth,calday) BETWEEN CAST(GETDATE() AS DATE) AND CAST(DATEADD(DAY,-1,DATEADD(YEAR,1,GETDATE())) AS DATE) 
ORDER BY CustomerName; 
0

也許像這樣的工作...

SELECT CustomerName, CalDay, CalMonth, CalYear, RequiredHours 
FROM [DLSizingDB].[dbo].[SMTRequiredHours] 
WHERE  
    SiteCode = 'MX01' AND 
    (
    (CalYear = YEAR(GETDATE()) AND CalMonth >= MONTH(GETDATE())) 
    OR 
    (CalYear = YEAR(GETDATE()) + 1 AND CalMonth < MONTH(GETDATE())) 
) 
ORDER BY CustomerName 

是無論是當前的年份和月份,比目前的一個月或一年越大,明年月小於當前月份。