2012-08-01 202 views
0

我已日期時間存儲在我的表中的字段LeaveFrom和LeaveTo的葉子,像日期時間基於查詢2008

LeaveFrom = 05/26/2012 12:00:00和LeaveTo = 06 /二千零十二分之三十零..等等

從前端我傳遞只月份和年份。那麼相同的搜索條件是什麼。

我需要年月明智的搜索條件。有多少人申請休假/或在特定月份缺席。

感謝所有的你..幾乎所有已接近預期...謝謝,我需要的是一個「提示」 ..感謝一噸到所有你們的..

+1

嗯,這取決於你在找什麼過濾器。你需要詳細說明一些。 – 2012-08-01 10:25:18

+1

你想要什麼結果?建議您最好給出示例數據和示例結果。 – MatBailie 2012-08-01 10:27:28

+0

如果我想檢查第5個月有多少人休假,該怎麼辦? – 2012-08-01 10:27:52

回答

1

據我所知,您希望所有在所選月份中具有在LeaveFrom和LeaveTo之間重疊的行。我提供了一些示例日期作爲文檔。

declare @yourtable table(LeaveFrom datetime, LeaveTo datetime) 
insert @yourtable values('2012-05-26 12:00:00', '2012-06-30') 
insert @yourtable values('2012-01-26 12:00:00', '2012-12-30') 
insert @yourtable values('2012-01-26 12:00:00', '2012-04-30') 
insert @yourtable values('2012-05-26 12:00:00', '2012-12-30') 
insert @yourtable values('2012-01-26 12:00:00', '2012-05-30') 
insert @yourtable values('2012-06-26 12:00:00', '2012-12-30') 
insert @yourtable values('2011-01-01 12:00:00', '2011-01-01') 

declare @month tinyint = 5 
declare @year int = 2012 

-- calculate a data corresponding to month and year (2012-05-01) 
declare @date datetime= dateadd(month, (@year-1900) * 12 + @month-1, 0) 

select * from @yourtable 
where datediff(month , LeaveFrom, @date) between 0 and datediff(month , LeaveFrom, LeaveTo) 

編輯:用同樣的結果另一種可能的方式:

select * from @yourtable 
where @date between dateadd(month, datediff(month, 0, LeaveFrom), 0) 
and dateadd(month, datediff(month, 0, LeaveTo), 0) 

結果:

LeaveFrom    LeaveTo 
----------------------- ----------------------- 
2012-05-26 12:00:00.000 2012-06-30 00:00:00.000 
2012-01-26 12:00:00.000 2012-12-30 00:00:00.000 
2012-05-26 12:00:00.000 2012-12-30 00:00:00.000 
2012-01-26 12:00:00.000 2012-05-30 00:00:00.000 
+0

這僅僅是我還是不是非常低效,因爲您將爲每條記錄調用dateadd()兩次? – 2012-08-02 10:40:36

+0

@GermannArlington你是對的,但它是唯一正確的解決方法,至少據我所知。我最終用數據中的例子來測試你的解決方案。 – 2012-08-03 09:18:46

+1

我只是試過你的數據集和選擇,它給了我相同的結果。我真的不明白爲什麼它不應該? 這裏是我使用的代碼... 'declare @dateFrom datetime; declare @dateTo datetime; set @dateFrom = DateAdd(day,0,DateAdd(month,@ Month - 1,DateAdd(Year,@ Year-1900,0))); set @dateTo = DATEADD(「month」,1,@dateFrom); SELECT * FROM @yourtable WHERE LeaveFrom <@dateTo AND LeaveTo> = @dateFrom; ' – 2012-08-03 09:45:57

2

假設你想獲得一組的人誰是休假在一個給定的月/年:

以下是完整的更新代碼,有些人可能會覺得有用:

declare @dateFrom datetime 
declare @dateTo datetime 
set @dateFrom = DateAdd(day, 0, DateAdd(month, @Month - 1, 
       DateAdd(Year, @Year-1900, 0))) 
set @dateTo = DATEADD("month", 1, @dateFrom) 
SELECT * FROM @yourtable WHERE LeaveFrom < @dateTo AND LeaveTo >= @dateFrom 

我做的計算日期點只一次,而不是爲每個選定的計算它們行。上面的代碼也可以輕鬆地轉換爲單個SQL語句。我這樣寫,使其易於閱讀。

1
SELECT * FROM {your table name} 
WHERE LeaveFrom >= CAST({input month} + '/1/' + {input year} AS DATETIME) AND 
    LeaveTo <= DATEADD(dd, -1, DATEADD(mm, 1, CAST({input month} + '/1/' + {input year} AS DATETIME))) 

而且更準確地說,您可以減去一分鐘而不是一整天。

SELECT * FROM {your table name} 
WHERE LeaveFrom >= CAST({input month} + '/1/' + {input year} AS DATETIME) AND 
    LeaveTo < DATEADD(mm, 1, CAST({input month} + '/1/' + {input year} AS DATETIME)) 

你開始混淆了你想要的每個人,但根據你最後的評論這裏是查詢。

SELECT * FROM {your table name} 
WHERE MONTH(LeaveFrom) = {input month} AND YEAR(LeaveFrom) = {input year} 
+0

如果您使用<而不是<= – 2012-08-01 10:31:47

+0

@NikolaMarkovinović您不需要減去任何東西好點。謝謝! – 2012-08-01 10:33:13

+0

但是你在這個假設下正在執行日期算術。 – 2012-08-01 10:37:41

2

嘗試:

where (MONTH(LeaveFrom) = @Month 
     and YEAR(LeaveFrom) = @Year) 
     OR 
     (and MONTH(LeaveTo) = @Month 
     and YEAR(LeaveTo) = @Year) 
+0

我認爲你需要一個來自和去日期之間的OR – 2012-08-01 10:33:06

+0

@GermannArlington:這是真的..謝謝你.. – 2012-08-01 10:35:29

+0

如果有任何列索引是不理想的。查看我發佈的方法 – Madhivanan 2012-08-01 11:32:36

1

.... 其中DATEPART(YYYY,LeaveFrom)= 2012和DATEPART(米,LeaveFrom)= 5 ....

1
DECLARE @month int 
DECLARE @year int 
SET @month = 7 
SET @year = 2012 

SELECT * FROM table 
WHERE 
(DATEPART(yy, LeaveFrom) = @year 
AND DATEPART(mm, LeaveFrom) = @month) OR 
(DATEPART(mm, LeaveTo) = @month AND DATEPART(yy, LeaveTo) = @Year) 
1

試試這個。Performancewise這會做最好的

declare @month int, @year int 
select @month=6, @year=2012 

select columns from table 
where 
LeaveFrom>=Dateadd(month,(@year-1900)*[email protected],0) and 
LeaveTo<Dateadd(month,(@year-1900)*[email protected],0) 

您可能還需要知道如何模擬DateSerial函數以不同的方式 http://beyondrelational.com/modules/2/blogs/70/posts/15788/10-ways-to-simulate-dateserial-function.aspx

+0

? – 2012-08-01 12:08:38

0

DECLARE @temp TABLE( ID INT IDENTITY(1,1) ,LeaveFrom DATETIME ,LeaveTo DATETIME ,用戶名VARCHAR(100) )

INSERT INTO @temp VALUES( '2015年1月1日 , '2015年1月5日' '拉梅什' ) ,( '2015年1月7日' , '2015年1月9日' '蘇雷什' ) ,( 「2015 - 01-03' '2015年1月6日' '的Dinesh' ) ,( '2015年1月15日' '2015年1月25日' '卡姆利什' ) ,( '2015-01-12' ,'2015-01-17' ,'Mohan' )

SELECT COUNT(*)FROM @temp 其中 '2015年' 之間YEAR(LeaveFrom) 和Year(LeaveTo) 和 '1' 之間MONTH(LeaveFrom) 和月(LeaveTo)