我有一個start_date
和end_date
。我想獲取這兩個日期之間的日期列表。任何人都可以幫助我指出我的查詢中的錯誤。SQL查詢選擇兩個日期之間的日期
select Date,TotalAllowance
from Calculation
where EmployeeId=1
and Date between 2011/02/25 and 2011/02/27
這裏Date
爲datetime
變量。
我有一個start_date
和end_date
。我想獲取這兩個日期之間的日期列表。任何人都可以幫助我指出我的查詢中的錯誤。SQL查詢選擇兩個日期之間的日期
select Date,TotalAllowance
from Calculation
where EmployeeId=1
and Date between 2011/02/25 and 2011/02/27
這裏Date
爲datetime
變量。
你應該把單引號之間的這兩個日期如..
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'
試試這個:
select Date,TotalAllowance from Calculation where EmployeeId=1
and [Date] between '2011/02/25' and '2011/02/27'
值需要日期爲類型爲字符串。
爲確保您的SQL Server 2008及更高版本的查詢符合未來要求,Date
應該轉義,因爲它是更高版本中的保留字。
請記住,沒有時間的日期以午夜爲默認值,因此您可能沒有正確的值。
日期不是關鍵字,不需要轉義。語法突出顯示只是語法突出顯示,如果關鍵字只會導致語法錯誤,則只需轉義即可。使用顯式轉換代替日期字符串常量的隱式轉換也是一種很好的做法。 - CAST日期('2011/02/25'DATETIME)和CAST('2011/02/27'DATETIME')之間的日期 – tponthieux 2011-02-26 09:27:41
當然,如果這是OP標記的SQL Server 2005,那麼您是對的。但是,Date在2008年以後會保留下來,所以爲了將來打樣,逃避它並沒有什麼壞處。我編輯了我的答案。 – 2011-02-26 16:42:19
如果他將指定單個日期都將返回零行,但我想這不是op的要求 – 2013-04-03 11:09:25
此查詢代表好當前的日期和它的下一個3日期間
獲取的值SELECT * FROM tableName WHERE columName
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)
這將最終緩衝的多出3天內陸續新增到當前日期。
這是MS SQL的不正確語法。 ( – Vadzim 2016-10-28 19:36:42
select * from test
where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'
- 如果數據類型是不同的
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
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');
)當你寫這個答案時,你可能會想到Oracle SQL,這在Oracle中是有效的,而不是在SQL Server中(從我所見到的內容中)。 – 2014-08-27 18:14:08
嘗試把例如## 之間的日期:
#2013/4/4# and #2013/4/20#
它爲我工作。
---編輯--- 我收到一個通知,我失去了兩個聲望點,因爲有人低估了這個答案。如果答案不適合你,請不要只是投票。在評論中詢問更多信息/幫助,或查看其他解決方案。
我不關心聲望點 - 我只是說,不贊成票。
在這種情況下做什麼# – 2014-10-29 20:23:02
@BK它是一個分隔符,就像字符串的引號 「當爲SQL語句提供值時,例如作爲查詢條件,它們的數據類型必須由」限定符「正確定義。這是通過在一對適當的字符之間包含值來完成的。「參考 - > [link](http://www.fontstuff.com/access/acctut15pfv.htm) – Casper 2014-10-31 15:01:51
@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
Select
*
from
Calculation
where
EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#;
由於沒有在規定的時間段中的日期時間將有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'
人們仍然看着這些問題和答案,甚至如果它們原本是在一段時間後出現的,我就來尋找答案,而我在這裏看到的大部分內容都不完整或絕對不正確,我的回答對原始海報沒有幫助,但它可能有助於某人,甚至可能有三年的時間現在, – WelshDragon 2014-02-28 14:01:20
你的回答幫了我很大的忙y,@WelshDragon - 其他答案遺漏了日期格式需要在服務器上「簡單日期」以忽略小時的事實。 「<= END_DATE」假定上午12點,我不知道。我正在執行一個查詢「... <= 01/01/2014」,我無法弄清楚爲什麼當天的訂單沒有顯示給第一個。非常感謝你。 – Keith 2014-06-24 20:13:44
@WelshDragon - 你的答案是使用日期作爲where子句的非常好的材料。謝謝 – 2016-03-14 01:37:29
如果在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'
最好查詢當前的日期和回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)
這是MS SQL的不正確語法。 – Vadzim 2016-10-28 19:37:06
select Date,TotalAllowance
from Calculation
where EmployeeId=1
and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27'
我喜歡使用語法 '1 MONTHNAME 2015年' 的日期前:
WHERE aa.AuditDate>='1 September 2015'
AND aa.AuditDate<='30 September 2015'
的日期
檢查下面的例子:兩個工作和非工作。
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**
我會去
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)
這是很老,但賦予了很多經驗,我曾與日期,你可能要考慮這個問題:人們使用不同的區域設置,正因爲如此,一些人員(以及一些數據庫/計算機,取決於區域設置)可能會在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'
,最好寫是這樣的:
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
在這種情況下使用存儲過程將毫無意義,因爲它會極大地降低SQL查詢的靈活性,因此它會非常具體,如果您不想在特定情況下使用它,請不要使用一個存儲過程 - 也有很多改進可用於你的存儲過程,你可以在這個社區找到它們)。 – 2017-09-10 15:31:41
您CA試試這個SQL
select * from employee where rec_date between '2017-09-01' and '2017-09-11'
我們可以使用之間顯示兩個日期數據,但這將搜索整個數據並進行比較,因此它會mak Ë我們的進程慢於龐大的數據,所以我建議大家使用datediff
:
qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 "
這裏壓延表,DT爲出發日期變量及DT2是整理日期變量。
SQL Server默認沒有時間的日期爲00:00:00。那麼這個查詢不會在午夜返回2011/02/25和2011/02/26的任何內容嗎? – Matt 2012-08-21 14:27:11
@Deepak,你的第二位應該說> =並且<= – IndoKnight 2013-06-26 10:49:09
您可能會提到該命令在BETWEEN函數中很重要。它必須從左邊的最老的和最近的右邊去。這是不直觀的,因爲=是sql中的一個比較運算符,並且在where子句中爲「EmployeeId = 1」或「1 = EmployeeId」工作。 – 2015-12-22 15:36:35