2011-02-26 180 views
193

我有一個start_dateend_date。我想獲取這兩個日期之間的日期列表。任何人都可以幫助我指出我的查詢中的錯誤。SQL查詢選擇兩個日期之間的日期

select Date,TotalAllowance 
from Calculation 
where EmployeeId=1 
    and Date between 2011/02/25 and 2011/02/27 

這裏Datedatetime變量。

回答

328

你應該把單引號之間的這兩個日期如..

select Date, TotalAllowance from Calculation where EmployeeId = 1 
      and Date between '2011/02/25' and '2011/02/27' 

或者可以使用

select Date, TotalAllowance from Calculation where EmployeeId = 1 
      and Date >= '2011/02/25' and Date <= '2011/02/27' 
+33

SQL Server默認沒有時間的日期爲00:00:00。那麼這個查詢不會在午夜返回2011/02/25和2011/02/26的任何內容嗎? – Matt 2012-08-21 14:27:11

+5

@Deepak,你的第二位應該說> =並且<= – IndoKnight 2013-06-26 10:49:09

+2

您可能會提到該命令在BETWEEN函數中很重要。它必須從左邊的最老的和最近的右邊去。這是不直觀的,因爲=是sql中的一個比較運算符,並且在where子句中爲「EmployeeId = 1」或「1 = EmployeeId」工作。 – 2015-12-22 15:36:35

12

試試這個:

select Date,TotalAllowance from Calculation where EmployeeId=1 
      and [Date] between '2011/02/25' and '2011/02/27' 

值需要日期爲類型爲字符串。

爲確保您的SQL Server 2008及更高版本的查詢符合未來要求,Date應該轉義,因爲它是更高版本中的保留字。

請記住,沒有時間的日期以午夜爲默認值,因此您可能沒有正確的值。

+1

日期不是關鍵字,不需要轉義。語法突出顯示只是語法突出顯示,如果關鍵字只會導致語法錯誤,則只需轉義即可。使用顯式轉換代替日期字符串常量的隱式轉換也是一種很好的做法。 - CAST日期('2011/02/25'DATETIME)和CAST('2011/02/27'DATETIME')之間的日期 – tponthieux 2011-02-26 09:27:41

+4

當然,如果這是OP標記的SQL Server 2005,那麼您是對的。但是,Date在2008年以後會保留下來,所以爲了將來打樣,逃避它並沒有什麼壞處。我編輯了我的答案。 – 2011-02-26 16:42:19

+1

如果他將指定單個日期都將返回零行,但我想這不是op的要求 – 2013-04-03 11:09:25

6

此查詢代表好當前的日期和它的下一個3日期間

獲取的值
SELECT * FROM tableName WHERE columName 
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY) 

這將最終緩衝的多出3天內陸續新增到當前日期。

+0

這是MS SQL的不正確語法。 ( – Vadzim 2016-10-28 19:36:42

5
select * from test 
    where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4' 

- 如果數據類型是不同的

7
select * from table_name where col_Date between '2011/02/25' 
AND DATEADD(s,-1,DATEADD(d,1,'2011/02/27')) 

這裏,第一天加入到當前的結束日期,這將是2011-02-28 00:00:00,那麼你減去一秒鐘,使結束日期2011-02-27 23:59:59。通過這樣做,您可以獲得給定間隔之間的所有日期。

output: 
2011/02/25 
2011/02/26 
2011/02/27 
-7
SELECT Date, TotalAllowance 
FROM Calculation 
WHERE EmployeeId = 1 
    AND Date BETWEEN to_date('2011/02/25','yyyy-mm-dd') 
       AND to_date ('2011/02/27','yyyy-mm-dd'); 
+1

)當你寫這個答案時,你可能會想到Oracle SQL,這在Oracle中是有效的,而不是在SQL Server中(從我所見到的內容中)。 – 2014-08-27 18:14:08

3

嘗試把例如## 之間的日期:

#2013/4/4# and #2013/4/20# 

它爲我工作。

---編輯--- 我收到一個通知,我失去了兩個聲望點,因爲有人低估了這個答案。如果答案不適合你,請不要只是投票。在評論中詢問更多信息/幫助,或查看其他解決方案。

我不關心聲望點 - 我只是說,不贊成票。

+0

在這種情況下做什麼# – 2014-10-29 20:23:02

+0

@BK它是一個分隔符,就像字符串的引號 「當爲SQL語句提供值時,例如作爲查詢條件,它們的數據類型必須由」限定符「正確定義。這是通過在一對適當的字符之間包含值來完成的。「參考 - > [link](http://www.fontstuff.com/access/acctut15pfv.htm) – Casper 2014-10-31 15:01:51

+1

@BK如果它是TSQL語法,則您將需要使用單引號(**'**)以獲得您所需的內容。 參考文獻 * [sql-fontstuff.com基礎知識](http://www.fontstuff.com/access/acctut15pfv。 htm) * [Beginning SQL - Paul Wilton,John Colby](http://books.google.rs/books?id=9eqbXSnji84C&printsec=frontcover#v=onepage&q&f=false) – Casper 2014-10-31 15:16:12

1
Select 
    * 
from 
    Calculation 
where 
    EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#; 
90

由於沒有在規定的時間段中的日期時間將有date 00:00:00.000的值,如果你想確保你得到所有的日期在你的範圍內,則必須提供及時爲您結束日期或增加結束日期並使用<

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date between '2011/02/25' and '2011/02/27 23:59:59.999' 

OR

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date >= '2011/02/25' and Date < '2011/02/28' 

OR

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date >= '2011/02/25' and Date <= '2011/02/27 23:59:59.999' 

請勿使用以下,因爲它可以從2011/02/28返回一些記錄,如果他們的時間是00:00:00.000 。

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date between '2011/02/25' and '2011/02/28' 
+32

人們仍然看着這些問題和答案,甚至如果它們原本是在一段時間後出現的,我就來尋找答案,而我在這裏看到的大部分內容都不完整或絕對不正確,我的回答對原始海報沒有幫助,但它可能有助於某人,甚至可能有三年的時間現在, – WelshDragon 2014-02-28 14:01:20

+3

你的回答幫了我很大的忙y,@WelshDragon - 其他答案遺漏了日期格式需要在服務器上「簡單日期」以忽略小時的事實。 「<= END_DATE」假定上午12點,我不知道。我正在執行一個查詢「... <= 01/01/2014」,我無法弄清楚爲什麼當天的訂單沒有顯示給第一個。非常感謝你。 – Keith 2014-06-24 20:13:44

+0

@WelshDragon - 你的答案是使用日期作爲where子句的非常好的材料。謝謝 – 2016-03-14 01:37:29

1

如果在24小時內和早晨和結束的夜晚開始日期應該增加類似:

declare @Approval_date datetime 
set @Approval_date =getdate() 
Approval_date between @Approval_date +' 00:00:00.000' and @Approval_date +' 23:59:59.999' 
2

最好查詢當前的日期和回3天之間的選擇日期:

select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN  
DATE_SUB(CURDATE(), INTERVAL 3 DAY) AND CURDATE() 
爲當前日期和 之間選擇日期

最佳查詢未來三天

select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN 
    CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY) 
+0

這是MS SQL的不正確語法。 – Vadzim 2016-10-28 19:37:06

3
select Date,TotalAllowance 
from Calculation 
where EmployeeId=1 
    and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27' 
0

我喜歡使用語法 '1 MONTHNAME 2015年' 的日期前:

WHERE aa.AuditDate>='1 September 2015' 
    AND aa.AuditDate<='30 September 2015' 

的日期

1

檢查下面的例子:兩個工作和非工作。

select * from tblUser Where  
convert(varchar(10),CreatedDate,111) between '2015/04/01' and '2016/04/01' //--**Working** 

OR

select * from tblUser Where 
(CAST(CreatedDate AS DATETIME) between CAST('2015/04/01' AS DATETIME) And CAST('2016/4/30'AS DATETIME)) //--**Working** 

OR

select * from tblUser Where 
(YEAR(CreatedDate) between YEAR('2015/04/01') And YEAR('2016/4/30')) 
//--**Working** 

及以下不工作:

select * from tblUser Where 
Convert(Varchar(10),CreatedDate,111) >= Convert(Varchar(10),'01-01-2015',111) and Convert(Varchar(10),CreatedDate,111) <= Convert(Varchar(10),'31-12-2015',111) //--**Not Working** 


select * from tblUser Where 
(Convert(Varchar(10),CreatedDate,111) between Convert(Varchar(10),'01-01-2015',111) And Convert(Varchar(10),'31-12-2015',111)) //--**Not Working** 
0

我會去

select Date,TotalAllowance from Calculation where EmployeeId=1 
      and Date >= '2011/02/25' and Date < DATEADD(d, 1, '2011/02/27') 

邏輯是>=包括整個開始日期和<排除結束日期,所以我們添加一個單位到結束日期。這可以適用於幾個月,例如:

select Date, ... from ... 
      where Date >= $start_month_day_1 and Date < DATEADD(m, 1, $end_month_day_1) 
4

這是很老,但賦予了很多經驗,我曾與日期,你可能要考慮這個問題:人們使用不同的區域設置,正因爲如此,一些人員(以及一些數據庫/計算機,取決於區域設置)可能會在2016年12月11日(2016年12月11日或2016年11月12日)讀取此日期。更多地,16/11/12提供給MySQL數據庫將在內部轉換爲12 2016年11月,而Access數據庫英國區域設置的計算機上運行會解釋並將其存儲爲11月16日2012年

因此,我做了我的政策是明確的,每當我要的日期和數據庫交互。所以我始終提供我的查詢和編程代碼如下:

SELECT FirstName FROM Students WHERE DoB >= '11 Dec 2016'; 

還要注意Access將接受#,即:

SELECT FirstName FROM Students WHERE DoB >= #11 Dec 2016#; 

但MS SQL Server將不會,所以我總是用「' 「如上所述,這兩個數據庫都接受。

並得到從代碼中的變量,年月日時,我總是將結果轉換爲字符串,如下所示:

"SELECT FirstName FROM Students WHERE DoB >= " & myDate.ToString("d MMM yyyy") 

我寫這個,因爲我知道有時候有些程序員可能不夠敏銳檢測固有的轉換。日期< 13不會有錯誤,只是不同的結果!

至於問的問題,添加一天的最後日期和作出比較如下:

dated >= '11 Nov 2016' AND dated < '15 Nov 2016' 
-1

,最好寫是這樣的:

CREATE PROCEDURE dbo.Get_Data_By_Dates 
(
    @EmployeeId INT = 1, 
    @Start_Date DATE, 
    @End_Date Date 
) 
AS 
Select * FROM Calculation 
    where [email protected] AND Test_Date BETWEEN @Start_Date AND @End_Date 
RETURN 
+0

在這種情況下使用存儲過程將毫無意義,因爲它會極大地降低SQL查詢的靈活性,因此它會非常具體,如果您不想在特定情況下使用它,請不要使用一個存儲過程 - 也有很多改進可用於你的存儲過程,你可以在這個社區找到它們)。 – 2017-09-10 15:31:41

0

您CA試試這個SQL

select * from employee where rec_date between '2017-09-01' and '2017-09-11' 
1

我們可以使用之間顯示兩個日期數據,但這將搜索整個數據並進行比較,因此它會mak Ë我們的進程慢於龐大的數據,所以我建議大家使用datediff

qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 " 

這裏壓延表,DT爲出發日期變量及DT2是整理日期變量。

相關問題