2017-10-13 149 views
0

我這裏有樣本數據:如何獲得基於期限最後一天一天,今天的數據

ID Val   dt 
1 Mohan 2017-10-13 13:02:49.493 
2 Manasa 2017-10-12 20:02:49.493 
3 maren 2017-10-13 18:02:49.493 

當我運行今天的聲明在下午2點,它應該給結果集6的最後一天PM之後的數據,以及今天的數據,直到今天,當我在今天下午7點運行聲明時,它應該在下午6點之後提供當天的數據。

如果我跑了它在今天凌晨2時許,其結果將是這樣

ID Val   dt 
1 Mohan 2017-10-13 13:02:49.493 
2 Manasa 2017-10-12 20:02:49.493 

如果我今天跑在下午7點:

ID Val   dt 
3 maren 2017-10-13 18:02:49.493 

基本的東西,如果我跑前下午6點,它應該在下午6點之前給出最後一天的數據,如果我在下午6點之後運行,它應該在下午6點之後給出數據。我已經嘗試過DATE DIFF條件但我無法證明結果的正確性 - 任何人都可以請建議嗎?

表腳本

Declare @tab table 
(ID INT,Val Varchar(10),dt datetime) 

Insert into @tab (ID,val,dt) 
values (1,'Mohan','2017-10-13 13:02:49.493'), 
(2,'Manasa','2017-10-12 20:02:49.493'), 
(3,'maren','2017-10-13 18:02:49.493') 

回答

0

嘗試這種情況:

DECLARE @Now DATETIME, @FromDate DATETIME 
SET @Now = GETDATE() 
SET @FromDate = DATEADD(HOUR, 18, DATEADD(DAY, DATEDIFF(DAY, 0, @Now) 
    - (CASE WHEN DATEPART(HOUR, @Now) < 18 THEN 1 ELSE 0 END), 0)) 

SELECT @Now, @FromDate 

SELECT * 
FROM @tab 
WHERE @FromDate < dt AND dt <= @Now 

結果:

Now      FromDate 
----------------------- ----------------------- 
2017-10-13 19:36:40.963 2017-10-13 18:00:00.000 

ID   Val  dt 
----------- ---------- ----------------------- 
3   maren  2017-10-13 18:02:49.493 

說明:

@FromDate計算如下:

  • (CASE WHEN DATEPART(HOUR, @Now) < 18 THEN 1 ELSE 0 END) - 如果時間不小於18(下午6點),則返回1
  • DATEADD(HOUR, 18, DATEADD(DAY, DATEDIFF(DAY, 0, @Now) - ... , 0)) - 返回 「6PM日期」,這是依賴於CASE表達式的結果上述
前一天或當天
+0

你能在給定的樣本數據實現這個......越來越糊塗 – mohan111

+0

@ mohan111,您可以提供創建表的腳本?你有足夠的聲譽知道如何問:) – Alex

+0

好的Alex我會修改問題 – mohan111

-3

你可以試試這個:

SELECT * FROM [yourTable] WHERE 
(dt between CONCAT(CAST(GETDATE() AS DATE), ' ', '18:00:00.000') AND 
    CONCAT(CAST(GETDATE() AS DATE), ' ', '23:59:59.999') 
    AND HOUR(GETDATE()) > 18) 
OR 
(dt between CONCAT(CAST(dt AS DATE) - INTERVAL 1 DAY, ' ', '18:00:00.000') 
     AND GETDATE() 
    AND HOUR(GETDATE()) < 18) 
+1

'DATE'和'NOW()'是無效的sql-server函數 – SQLBadPanda

+0

以爲你在談論mysql;) – NullPointer

1

你可以做到這一點通過創建昨天下午6點,即今天下午6點來模擬你的一天「窗口」,兩個日期,根據當前時間是在當前下午6點之前還是之後調整昨天/今天的概念。然後,您只需選擇您的數據,其中dt是這兩個日期之間(或使用< =和>或任何你需要包含或排除相關行)如...

DECLARE @t table (ID int,Val varchar(30),dt datetime2(3)) 
INSERT @t(ID,Val,dt) 
VALUES(1,'Mohan' ,'2017-10-13T19:02:49.493'), 
     (2,'Manasa','2017-10-12T20:02:49.493'), 
     (3,'maren' ,'2017-10-13T07:02:49.493'); 

DECLARE @now datetime2 = dateadd(HOUR,12,sysdatetime()); 

SELECT *, 
     @now, 
     x.Today6pm, 
     x.Yesterday6pm 
FROM @t AS t 
CROSS APPLY (VALUES(DATEADD(day, DATEDIFF(day,'19000101',cast(@now AS date))-(CASE WHEN cast(@now AS time) < timefromparts(18,00,00,0,0) THEN 1 ELSE 0 END), CAST(timefromparts(18,00,00,0,0) AS DATETIME2(7))), 
        DATEADD(day, DATEDIFF(day,'19000101',cast(@now AS date))+(CASE WHEN cast(@now AS time) > timefromparts(18,00,00,0,0) THEN 1 ELSE 0 END), CAST(timefromparts(18,00,00,0,0) AS DATETIME2(7))))) x(Yesterday6pm,Today6pm) 
WHERE dt BETWEEN x.Yesterday6pm AND x.Today6pm 

這裏的CROSS APPLY是simplfy的否則你可以直接將這些函數放在WHERE謂詞中。

變量@now僅用於測試以確保調整工作,而不是等到今天晚上6:01分。顯然,在你的代碼中,只需將@now替換爲sysdatetime()即可。

注意:如果您的日期是日期時間,那麼一起添加日期和時間「有效」,但它不適用於datetime2。上述方法適用於日期時間和日期時間2,因此更具彈性。

1
DECLARE @T TABLE 
(
    ID INT, 
    Val VARCHAR(50) ,   
    dt DATETIME 
) 
INSERT INTO @T 
VALUES 
(1, 'Mohan ', '2017-10-13 13:02:49.493'), 
(2, 'Manasa ', '2017-10-12 20:02:49.493'), 
(3, 'maren ', '2017-10-13 18:02:49.493') 

DECLARE @CURRENT datetime = '13 oct 2017 18:00' 
SELECT 
* 
FROM @T 
WHERE 
    (
     CAST(@CURRENT as time) BETWEEN '00:00' AND '18:00' AND 
     dt BETWEEN DATEADD(day,-1,DATEADD(hh,18,CAST(CAST(@CURRENT as date) as datetime))) AND DATEADD(hh,18,CAST(CAST(@CURRENT as date) as datetime)) 
    ) OR 
    (
     CAST(@CURRENT as time) NOT BETWEEN '00:00' AND '18:00' AND 
     dt >=DATEADD(hh,18,CAST(CAST(@CURRENT as date) as datetime)) 
    ) 
1

您可以試試這個腳本。

SELECT * FROM MyTable WHERE 
((CAST(GETDATE() AS TIME) < '18:00') 
    AND dt < DATEADD(HOUR,18, CAST(CAST(GETDATE() AS DATE) AS DATETIME))) 
OR 
((CAST(GETDATE() AS TIME) >= '18:00') 
    AND dt >= DATEADD(HOUR,18, CAST(CAST(GETDATE() AS DATE) AS DATETIME))) 
相關問題