2つの日付の間の日付を選択するSQLクエリ


303

とがstart_dateありend_dateます。これら2つの日付の間にある日付のリストを取得したい。誰かが私のクエリの間違いを指摘するのを手伝ってくれる?

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

これDatedatetime変数です。

回答:


484

次のように、これら2つの日付を単一引用符で囲みます。

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'

最初の日付は包括的ですが、2番目の日付は事実上「2011/02/27 00:00:00」であるため、排他的であることを覚えておいてください


42
SQL Serverは、デフォルトで時刻のない日付を00:00:00に設定します。それで、このクエリは2011/02/25と2011/02/26の真夜中に何かを返しませんか?
マット

5
@ Deepak、2番目のビットは> =および<=である必要があります
IndoKnight

3
BETWEEN関数で順序が重要であることを言及するかもしれません。左から最も古いものから、右から新しいものに移動する必要があります。=はSQLの比較演算子であり、where句の「EmployeeId = 1」または「1 = EmployeeId」の両方で機能するため、これは直感的ではありません。
Fi Horan

のドキュメントによると、@ Mattは、行に日付のない2011/02/27の日付がある場合、その行は2011/02/27 00:00の日付を持つことに相当し、クエリ、それが2011/02/27 00:00以下であるため。したがって、時間を扱わない場合はbetween、期待どおりに動作するはずです。
timctran 2016年

@timctran正解ですが、2011/02/27 00:00は2011/02/26の真夜中と呼ばれるものです。おそらく、クエリは結果セットに27番目を含めることを意味しますが、タイムスタンプが2011/02/27 5:00のエントリは含まれません。
シンジャイ

128

指定された時間セグメントのないdatetimeの値は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'

または

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

または

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

以下は使用しないでください。時刻が00:00:00.000の場合、2011/02/28から一部のレコードが返される可能性があります。

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

42
もともとは少し前に提起されていたとしても、人々はこれらの質問と回答をまだ見ています。私は答えを探しに来ました、そして私がここで見たものの多くは不完全であるか完全に不正確でした。私の答えは元のポスターには役立ちませんが、おそらく3年後の誰かにも役立つかもしれません。
WelshDragon 2014

3
@WelshDragon-あなたの答えは私を大いに助けました-他の答えは、時間の形式を無視するためにサーバー上で日付形式が「単純な日付」である必要があるという事実を除外しました。「<= END_DATE」は午前12時を想定しており、私にはわかりませんでした。「... <= 01/01/2014」でクエリを実行していましたが、その日の注文が1日目に表示されなかった理由がわかりませんでした。どうもありがとうございました。
キース

@WelshDragon-あなたの答えは、where句として日付を使用するための非常に良い資料です。ありがとう
ジャックフロスト

戻ってきたらどうしたの '2011/02/28 00:00:00.000'
Muflix 2017

1
今日これを試しましたが、convert(date, Date) between '2011/02/25' and '2011/02/27'(少なくとも最近のMS SQL Serverで)使用することもできます。convert()パートタイムの一部を除去してくれますし、期待通りの比較の間に、次に動作します。
センセイ

14

これを試して:

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

日付の値は文字列として入力する必要があります。

SQL Server 2008以降のクエリの将来性を保証するにDateは、をエスケープする必要があります。これは、それ以降のバージョンでは予約語であるためです。

時間のない日付はデフォルトで午前0時をとるため、正しい値がない可能性があることに注意してください。


1
日付はキーワードではなく、エスケープする必要はありません。構文の強調表示は構文の強調表示にすぎません。キーワードが構文エラーを引き起こす場合にのみ、キーワードをエスケープする必要があります。また、日付文字列定数の暗黙的な変換の代わりに、明示的な変換を使用することもお勧めします。-およびCAST( '2011/02 / 25'AS DATETIME)とCAST(' 2011/02 / 27'AS DATETIME)の間の日付
tponthieux

5
これがSQL Server 2005であり、OPがタグ付けしたものであれば当然です。ただし、Dateは2008年以降に予約されているため、将来を保証するために、エスケープしても害はありません。回答を編集しました。

1
彼が両方に単一の日付を指定する場合、それはゼロ行を返しますが、それはopの要件ではないと思います
Zoは

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

ここでは、まず現在のendDateに日を追加します。これはになります2011-02-28 00:00:00。次に、1秒を減算して終了日を作成します2011-02-27 23:59:59。これを行うことにより、指定された間隔の間のすべての日付を取得できます。

output:
2011/02/25
2011/02/26
2011/02/27

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

-データ型が異なる場合


5

このクエリは、現在の日付と次の3つの日付の間の値をフェッチするのに適しています

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

これにより、最終的に現在の日付にさらに3日間のバッファーが追加されます。


5

これは非常に古いですが、日付に関する多くの経験があるので、これを検討することをお勧めします。人々はさまざまな地域設定を使用しているため、一部の人々(および地域設定によっては一部のデータベース/コンピューター)がこれを読む可能性があります日付2016年12月11日または2016年11月12日として2016年12月11日。さらに、MySQLデータベースに提供された16/11/12は内部で2016年11月12日に変換されますが、英国の地域設定コンピューターで実行されるAccessデータベースは解釈し、 2012年11月16日として保存します。

そのため、日付やデータベースを操作するときは常にポリシーを明示的にするようにしました。したがって、私は常に次のようにクエリとプログラミングコードを提供します。

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

Accessが#を受け入れることにも注意してください。したがって、

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

しかし、MS SQLサーバーはそうしないので、両方のデータベースが受け入れる上記のように、常に「 '」を使用します。

そして、コード内の変数からその日付を取得するときは、常に次のように結果を文字列に変換します。

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

これを書いているのは、一部のプログラマーが固有の変換を検出するのに熱心でない場合があることを知っているためです。13未満の日付ではエラーは発生せず、結果が異なるだけです。

尋ねられた質問については、最後の日付に1日を追加し、次のように比較します。

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

あなたの情報は私の仕事を完了するのに役立ちました。私はこれに10時間以上取り組んできましたが、どの答えも私にはうまくいきません。あなたが示したように私が連結するとき、私のプロジェクトは素晴らしい働きをします。しかし、ルールはこのようなSQLステートメントを記述しないことです。SqlCommandを設定して日付パラメーターをSQLステートメントに追加しようとすると、パラメーターがアタッチされず、「@ startDate」と「@endDate」を宣言する必要があるというエラーが発生します。この問題に合格できません。私はあなたの日付フォーマット "dd MMM yyyy"を試してみましたが、私は "yyyy MMM dd"も試して同じことを行いました。
デイブハンペル

助かりました!上記はコードサンプルです。SQLインジェクションを回避するために、パラメーターを宣言して使用することを常にお勧めします。そして、あなたはすでにプロジェクトのルールによって要求/保護されているようです、それは良いことです。
ハニントンマンボ

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

3

たとえば、#の間に日付を入れてみてください。

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

それは私のために働いた。


1
このコンテキストで#は何をしますか?
BK

@BK文字列の引用符のような区切り文字です。「SQLステートメントに値を提供する場合、たとえばクエリ基準として、それらのデータ型は「修飾子」によって正しく定義される必要があります。これは、適切な文字のペアで値を囲むことによって行われます。」参照-> リンク
Aleksandar

1
@BK TSql構文の場合、必要なものを取得するために単一引用符(')を使用する必要があります。参照* sql-fontstuff.comの基本 * SQLの開始
Aleksandar

1
問題がSQL ServerとT-SQLに関するものであることをこれ以上明確にすることはできません。T-SQLとSQL Serverはハッシュタグ間の日付を受け入れません。単一引用符の間の日付を受け入れます。この答えは間違っています。
TT。

@TT。賛成票の数は、それがまだ誰かを助けたと言っています。私が回答を書いた時点で、受け入れられた回答はすでに選択されていました。それでも、Googleまたは他の場所からここに来る可能性のある人を助けるためにこれを書きました:)
Aleksandar

2

その日付が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'

1

現在の日付から3日前までの選択した日付の最適なクエリ:

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

現在の日付と次の3日間の間の選択した日付の最適なクエリ:

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

1

以下の例を確認してください。

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

または

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

または

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

AND以下は機能しません:

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**

1

betweenを使用して2つの日付データを表示できますが、これによりデータ全体が検索および比較されるため、巨大なデータの処理が遅くなるため、誰もが使用することをお勧めしますdatediff

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

ここで、calenderはテーブル、dtは開始日変数、dt2は終了日変数です。


0

私は日付の構文に「1 MonthName 2015」を使用するのが好きですex:

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

日付について


0

私は行きます

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

>=開始日全体を含み、<終了日を除外するロジックであるため、終了日に1単位を追加します。これは、たとえば数か月間適応できます。

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


0

あなたはこのSQLを試すことができます

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


0
/****** Script for SelectTopNRows command from SSMS  ******/
SELECT TOP 10 [Id]
  ,[Id_parvandeh]
  ,[FirstName]
  ,[LastName]
  ,[RegDate]
  ,[Gilder]
  ,[Nationality]
  ,[Educ]
  ,[PhoneNumber]
  ,[DueInMashhad]

  ,[EzdevajDate]


  ,[MarriageStatus]
  ,[Gender]
  ,[Photo]

  ,[ModifiedOn]
  ,[CreatorIp]
   From
  [dbo].[Socials] where educ >= 3 or EzdevajDate  >= '1992/03/31' and EzdevajDate <= '2019/03/09' and MarriageStatus = 1

-2

次のように書く方が良いでしょう:

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

1
この状況でストアドプロシージャを使用すると、SQLクエリの柔軟性が大幅に低下するため、意味がありません。非常に具体的です。本当に具体的な状況で使用したくない場合は、使用しないでください。 Stored-Procedure-また、このコミュニティでそれらを見つけることができるStored-Procedureの多くの改善点があります;)。
shA.t 2017

-6
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ではそれほどではありません。
Charles Caldwell
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.