我已日期時間存儲在我的表中的字段LeaveFrom和LeaveTo的葉子,像日期時間基於查詢2008
LeaveFrom = 05/26/2012 12:00:00和LeaveTo = 06 /二千零十二分之三十零..等等
從前端我傳遞只月份和年份。那麼相同的搜索條件是什麼。
我需要年月明智的搜索條件。有多少人申請休假/或在特定月份缺席。
感謝所有的你..幾乎所有已接近預期...謝謝,我需要的是一個「提示」 ..感謝一噸到所有你們的..
我已日期時間存儲在我的表中的字段LeaveFrom和LeaveTo的葉子,像日期時間基於查詢2008
LeaveFrom = 05/26/2012 12:00:00和LeaveTo = 06 /二千零十二分之三十零..等等
從前端我傳遞只月份和年份。那麼相同的搜索條件是什麼。
我需要年月明智的搜索條件。有多少人申請休假/或在特定月份缺席。
感謝所有的你..幾乎所有已接近預期...謝謝,我需要的是一個「提示」 ..感謝一噸到所有你們的..
據我所知,您希望所有在所選月份中具有在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
這僅僅是我還是不是非常低效,因爲您將爲每條記錄調用dateadd()兩次? – 2012-08-02 10:40:36
@GermannArlington你是對的,但它是唯一正確的解決方法,至少據我所知。我最終用數據中的例子來測試你的解決方案。 – 2012-08-03 09:18:46
我只是試過你的數據集和選擇,它給了我相同的結果。我真的不明白爲什麼它不應該? 這裏是我使用的代碼... '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
假設你想獲得一組的人誰是休假在一個給定的月/年:
以下是完整的更新代碼,有些人可能會覺得有用:
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語句。我這樣寫,使其易於閱讀。
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}
如果您使用<而不是<= – 2012-08-01 10:31:47
@NikolaMarkovinović您不需要減去任何東西好點。謝謝! – 2012-08-01 10:33:13
但是你在這個假設下正在執行日期算術。 – 2012-08-01 10:37:41
嘗試:
where (MONTH(LeaveFrom) = @Month
and YEAR(LeaveFrom) = @Year)
OR
(and MONTH(LeaveTo) = @Month
and YEAR(LeaveTo) = @Year)
我認爲你需要一個來自和去日期之間的OR – 2012-08-01 10:33:06
@GermannArlington:這是真的..謝謝你.. – 2012-08-01 10:35:29
如果有任何列索引是不理想的。查看我發佈的方法 – Madhivanan 2012-08-01 11:32:36
.... 其中DATEPART(YYYY,LeaveFrom)= 2012和DATEPART(米,LeaveFrom)= 5 ....
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)
試試這個。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
? – 2012-08-01 12:08:38
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)
嗯,這取決於你在找什麼過濾器。你需要詳細說明一些。 – 2012-08-01 10:25:18
你想要什麼結果?建議您最好給出示例數據和示例結果。 – MatBailie 2012-08-01 10:27:28
如果我想檢查第5個月有多少人休假,該怎麼辦? – 2012-08-01 10:27:52