2016-11-17 224 views
1

我試圖實現一個簡單的SQL查詢,可以在今天的固定時間(例如18:00)和昨天的固定時間(例如18:00)之間獲取記錄。在昨天和今天之間選擇記錄

SELECT * FROM [Table] 
WHERE [Table].[Date Time] > Now()-1; 

但是,這將返回今天的當前時間和昨天之間的所有記錄。

有沒有辦法在指定的時間內返回記錄?

編輯︰ 我試過這個查詢,但它的拋出語法錯誤。

SELECT * FROM [Table] 
WHERE [Date Time] BETWEEN FORMAT(DATEADD(DAY, - 1, NOW()) AS DATETIME) + FORMAT('18:00:00' AS TIME) AND FORMAT(NOW() AS DATETIME) + FORMAT('18:00:00' AS TIME); 

任何幫助?

+0

添加更多細節。如示例 –

+0

@ Mr.Bhosale如果我們現在說的是** 17-Nov-16 19:00:00 **,我希望返回** Table-Nov-16 18:00之間的所有記錄:00 **至** 17-Nov-16 18:00:00 **。會有可能嗎?如果我使用'Now() - 1',它將在** 16-Nov-16 19:00:00和** 17-Nov-16 19:00:00之間返回** –

+0

@Fionnuala它仍然返回我一個語法錯誤。 SELECT * FROM [正在處理分析結果] WHAT [日期時間]格式之間(DATEADD(「h」,-25,NOW())作爲日期時間)+格式(時間'18:00:00')和格式(NOW()AS DATETIME)+ FORMAT('18:00:00'AS TIME);' –

回答

1

您需要添加變量日期值和固定時間值。

日期/時間常數可以變化以所有不同的本地格式。隨着TimeSerial我們能夠避免這樣的:

SELECT * 
FROM [Table] 
WHERE [Table].[Date Time] Between Date()-1 + TimeSerial(18,0,0) 
           And Date() + TimeSerial(18,0,0) 

(第一個建議,可與德國日期格式)

SELECT * 
FROM [Table] 
WHERE [Table].[Date Time] Between Date()-1 + #18:00:00# And Date() + #18:00:00# 

的查詢設計器可以自動改變成

Between Date()-1 + #12/30/1899 18:00:00# And Date() + #12/30/1899 18:00:00# 

1899-12-30這是Access中的「Date zero」。

+0

謝謝。我的[日期時間]列定義爲'dd/mm/yyyy hh:mm:ss'我使用了您的查詢並且沒有任何語法錯誤,但它沒有顯示任何記錄。在我的數據庫中,我有** 17/10/2016 6:00:00 PM **,** 17/10/2016 2:00:00 PM **,** 17/10/2016 10:00:00 AM **,** 16/10/2016 7:00:00 PM **。但它沒有顯示任何這些... –

+0

@永祥:這個列格式不應該有任何影響。也許試試'#6:00:00 PM#'而不是'#18:00:00#'。 – Andre

+0

@YongXiangSoh:或者用'TimeSerial'來設置日期格式的獨立性,請參閱編輯。 – Andre

1

你的意思是這樣的嗎?

SELECT * 
FROM [Table] 
WHERE [Table].[Date Time] between #16/11/2016 14:00:00# and #17/11/2016 14:00:00# 

但要注意MDY - DMY日期格式..

我喜歡ODBC C格式以避免出現問題:

SELECT * 
FROM [Table] 
WHERE [Table].[Date Time] between {ts'1970-01-12 14:00:00' } and {ts'1975-01-12 14:00:00'} 
+0

是的,它是類似的東西。但我不希望硬編碼日期時間。如果今天是16-Nov-16,則將在16-Nov-16和17-Nov-16之間進行查詢。如果明天是16 -18-Nov-16,則將在16-17-16-16-16-16間查詢。 –

+0

看我的其他答案 – MtwStark

0

嘗試下面的查詢

  declare 
        @StartDate DATE = NULL, 
        @EndDate DATE = NULL 

      SELECT * FROM [Table]  
      WHERE 
      CAST([Date Time] AS DATE) >= CAST(ISNULL(@StartDate, '') AS DATE) 
      AND CAST([Date Time] AS DATE) <= CAST(ISNULL(@EndDate, '') AS DATE) 

或者乾脆將日期放入@StartDate和@EndDate。

+0

這是SQL Server的一個例子。 SQL是一個通用標記,並且這個標記被標記爲MS Access。 – Fionnuala

0

你可能想在18.00首先宣佈了今天的日期變量,然後比較你的日期,在訪問您可以使用TIMEVALUE()函數:

Dim Time18 
Time18 = TimeValue("18:00") 

然後您可以比較日期到,有一天回來:今天

SELECT * FROM [Table] 
WHERE (
    (DateValue([Table].[Date Time]) = DateValue(Now() - 1) AND 
    TimeValue([Table].[Date Time]) >= Time18) OR 
    (DateValue([Table].[Date Time]) = DateValue(Now() AND 
    TimeValue([Table].[Date Time]) <= Time18)) 
+0

這是SQL Server,而不是MS Access。 – Fionnuala

+0

@Fionnuala你能幫忙嗎? –

0

使用日期(),而不是現在()

假設是17nov(任何時候),

,如果你需要昨天16nov的記錄(00:00 - > 23:59),您必須使用日期() - 1的下限和日期()爲上限

SELECT * 
FROM [Table] 
WHERE [Table].[Date Time] between date()-1 and date() 

,如果你需要的記錄今天17nov(00:00 - > 23:59),您必須使用日期()作爲下限和日期()+ 1作爲上限

SELECT * 
FROM [Table] 
WHERE [Table].[Date Time] between date() and date()+1 

這是一個簡單的版本,它與邊界的小問題,正確的過濾器應該是(對於昨天)

SELECT * 
FROM [Table] 
WHERE [Table].[Date Time] >= date()-1 [Table].[Date Time] < date() 

,或者今天:

SELECT * 
FROM [Table] 
WHERE [Table].[Date Time] >= date() [Table].[Date Time] < date()+1 
+0

我無法獲取任何記錄以顯示使用此查詢。 –

+0

謝謝。雖然這不是我正在尋找的,但感謝您的幫助。 –

0

你可以試試下面的查詢的SQL Server:

SELECT * FROM [Table] 
WHERE DATEADD(HH, 18, CAST(CAST([Table].[Date Time] AS DATE) AS DATETIME)) > DATEADD(HH, 18, CAST(CAST(Now() AS DATE) AS DATETIME))-1; 
+0

謝謝。但我正在使用MS Access。有一些區別嗎? –

+0

我對MS Access沒有太多的想法。您需要將MS Access中的Cast功能更改爲首先刪除時間部分,並將其轉換爲日期時間並添加小時。 –