2015-01-16 62 views
0

我在SQL表Beg_dateEnd_date包括Employee-ID中有兩個日期。在兩個日期之間查找特定月份和年份

需要傳遞兩個參數@Month@Year找到既@Month@Year是否這些Beg_dateEnd_date之間。

實施例:

傳值@Month = '11'@Year = '2014'

表數據:Beg_date = '10/1/2013'End_date = '12/31/2014'

由於,在@Month@Year都進來上述日期,它應該顯示Employee-ID

現在,如果將值@Month = '11'@Year = '2012'傳遞給上述表日期,則不應顯示數據。

員工在同一個表中有多個記錄的另一件事情,Beg_dateEnd_date;腳本應該搜索所有的記錄之前給出結果

例子:

Employee-ID  Beg_date  End_date 
----------------------------------------- 
0001   01/01/2013  11/30/2013 
0001   12/01/2013  11/30/2014 
0001   12/01/2014  11/30/2015 

請指教...

+0

'Mysql的<>的Sql Server'其中之一使用的是? –

回答

0

更新 - 2:

下面的查詢應爲所描述的工作問題在你的MS SQL 2005環境的問題。該解決方案主要基地使用CONVERT函數數據類型轉換:

SELECT 
    * 
FROM 
    tab 
WHERE 
    CONVERT(DATETIME, 
      LTRIM(RTRIM(CONVERT(NVARCHAR(10), @Year))) 
      + '-' + RIGHT('0' + LTRIM(RTRIM(CONVERT(NVARCHAR(10), @Month))), 2) 
      + '-01', 120) 
    >= CONVERT(DATETIME, 
      LTRIM(RTRIM(CONVERT(NVARCHAR(10), YEAR(Beg_date)))) 
      + '-' + RIGHT('0' + LTRIM(RTRIM(CONVERT(NVARCHAR(10), MONTH(Beg_date)))), 2) 
      + '-01', 120) 
    AND 
    CONVERT(DATETIME, 
      LTRIM(RTRIM(CONVERT(NVARCHAR(10), @Year))) 
      + '-' + RIGHT('0' + LTRIM(RTRIM(CONVERT(NVARCHAR(10), @Month))), 2) 
      + '-01', 120) 
    <= CONVERT(DATETIME, 
      LTRIM(RTRIM(CONVERT(NVARCHAR(10), YEAR(End_date)))) 
      + '-' + RIGHT('0' + LTRIM(RTRIM(CONVERT(NVARCHAR(10), MONTH(End_date)))), 2) 
      + '-01', 120) 

它建立了針對給定參數@Year@MonthBeg_dateEnd_date有效DATETIME。從你的例子所採取的WHERE相比,示例值是:

  • @Year@Month2014-11-01 00:00:00
  • Beg_date2013-12-01 00:00:00
  • End_date2014-11-30 00:00:00

其條件將得到滿足。

你可以在SQL Fiddle找到一個工作示例。它在那裏爲MSSQL 2008(那裏最早的可用版本)完成,但是語法和函數也應該在MSSQL 2005上工作。

我希望它能幫助你。

此答案的前一版本是基於我使用MySQL數據庫的錯誤假設 。

+0

謝謝,這項工作太棒了!但是我忘記提到他們在同一個表中使用不同的Beg_date和End_date的同一員工的多個記錄。在給出結果之前,腳本應在所有記錄中搜索月份和年份。請告知... – Paul

+0

嗨。我很高興它的幫助。據我所知,上面的查詢應該搜索你的表中的所有記錄,併爲他們每個人檢查'where'條款中的條件,所以我認爲它已經這樣做 - 或者我錯過了什麼? –

+0

出於某種原因,它只是在一個記錄日期之間進行搜索。以下是包含三條記錄的示例:1. Beg_date = 2013年4月1日,結束日期= 2013年9月30日2. 1. Beg_date = 10/01/2013,結束日期= 2014年9月30日和3。 Beg_date = 10/01/2014,結束日期= 2014年12月31日。我搜索月= 11和年= 2013,它沒有顯示任何結果。請指教... – Paul

0

它可與DATEFROMPARTS功能可以容易地實現:

DECLARE @Month INT = 9 
DECLARE @Year INT = 2014 
DECLARE @ResultDate DATE 

DECLARE @t TABLE 
    (
     [Employee-ID] CHAR(4) , 
     Beg_date DATETIME , 
     END_date DATETIME 
    ) 


SET @ResultDate = CAST(CAST(@Year AS NVARCHAR(MAX)) + REPLICATE('0', 2 - LEN(CAST(@Month AS NVARCHAR(MAX)))) + CAST(@Month AS NVARCHAR(MAX)) + '01' AS DATE) 


INSERT INTO @t 
VALUES ('0001', '20130101', '20131130'), 
     ('0002', '20130112', '20141130'), 
     ('0003', '20140112', '20151130') 

SELECT * 
FROM @t 
WHERE @ResultDate BETWEEN Beg_date AND END_date 

輸出:

Employee-ID Beg_date END_date 
0002  2013-01-12 2014-11-30 
0003  2014-01-12 2015-11-30 
+0

我正在使用SQL Server 2005並在運行查詢時遇到錯誤('DATEFROMPARTS'不是公認的內置函數名稱),請指教。 – Paul

+0

好的,我已更新回答 –

+0

這工作完美;非常感謝你的幫助。我非常感謝。 – Paul

相關問題