두 날짜 사이의 날짜를 선택하는 SQL 쿼리


303

나는이 start_dateend_date. 이 두 날짜 사이의 날짜 목록을 얻고 싶습니다. 누구든지 내 쿼리에서 실수를 지적하도록 도울 수 있습니까?

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

변수 Date는 다음과 같습니다 datetime.

답변:


484

이 두 날짜를 작은 따옴표로 묶어야합니다.

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'

첫 번째 날짜는 포괄적이지만 두 번째 날짜는 '2011/02/27 00:00:00'이므로 배타적입니다.


42
SQL Server는 시간이없는 날짜를 00:00:00으로 기본 설정합니다. 이 쿼리는 자정에 2011/02/25 및 2011/02/26에서 아무것도 반환하지 않습니까?
Matt

5
@Deepak, 두 번째 비트는> = 및 <=라고 말해야합니다.
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 인 항목은 포함되지 않습니다.
Sinjai 2012

128

지정된 시간 세그먼트가없는 날짜 시간의 값은 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

3
귀하의 답변은 @WelshDragon에 크게 도움이되었습니다. 다른 답변은 시간 형식을 무시하기 위해 서버에서 날짜 형식이 "간단한 날짜"여야한다는 사실을 생략했습니다. "<= END_DATE"는 오전 12 시라고 가정합니다. "... <= 01/01/2014"로 쿼리를 수행했는데 해당 날짜의 주문이 1 일에 표시되지 않은 이유를 알 수 없었습니다. 대단히 감사합니다.
Keith

@WelshDragon-귀하의 답변은 날짜를 where 절로 사용하는 데 매우 좋은 자료입니다. 감사합니다
Jack Frost

그것이 반환되면 무엇이 잘못 '2011/02/28 00:00:00.000'되었습니까?
Muflix

1
오늘 시도해 보았지만 convert(date, Date) between '2011/02/25' and '2011/02/27'(최소한 최신 MS SQL Server와 함께) 사용할 수도 있습니다 . convert()부분은 시간 부분을 제거 처리됩니다 예상대로 비교 사이는 작동합니다.
sensei

14

이 시도:

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'AS DATETIME) ~ CAST ('2011 / 02 / 27'AS DATETIME)
tponthieux

5
이것이 OP가 태그 한 SQL Server 2005라면 당연히 옳습니다. 그러나 Date는 2008 년부터 예약되어 있으므로 향후 보장을 위해 이스케이프 처리에 아무런 해가 없습니다. 내 답변을 편집했습니다.

1
그는 모두 하나의 날짜를 지정한다면 제로 행을 반환하지만 그 작전의 요구 사항이 아닙니다 생각
배리는 가지고

12
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종료 날짜에 요일을 추가하면됩니다 . 그런 다음 종료 날짜를 만들기 위해 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 년 11 월 12 일. 2016 년 11 월 12 일 또는 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에 대해서는 오류가 없으며 단지 다른 결과입니다!

묻는 질문에 대해서는 마지막 날짜에 하루를 추가하고 다음과 같이 비교하십시오.

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

당신의 정보는 내 임무를 완수하는 데 도움이되었습니다. 나는 이것에 대해 10 시간 이상 노력했으며 대답이 아닌 것이 나를 위해 일할 것입니다. 내가 당신처럼 연결하면 내 프로젝트가 훌륭하게 작동합니다. 그러나 규칙은 이와 같은 SQL 문을 작성하지 않는 것 같습니다. SQL 매개 변수에 날짜 매개 변수를 추가하도록 SqlCommand를 설정하려고하면 매개 변수가 첨부되지 않으며 "@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을 - 폴 윌튼, 존 콜비
알렉산다르

1
질문이 SQL Server 및 T-SQL에 대한 것임을 더 이상 분명하게 알 수 없었습니다. T-SQL과 SQL Server는 해시 태그 사이의 날짜를 허용하지 않으며 작은 따옴표 사이의 날짜를 허용합니다. 이 답변은 잘못되었습니다.
TT.

@TT. 공감 자의 수는 여전히 누군가를 도왔다 고 말합니다. 답변을 썼을 때 이미 승인 된 답변이 선택되었습니다. 아직도, 나는 구글이나 다른 곳에서 온 사람들을 돕기 위해 이것을 썼습니다 :)
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**

아래는 작동하지 않습니다.

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

우리는 두 날짜 데이터를 표시하기 위해 사이를 사용할 수 있지만 전체 데이터를 검색하고 비교하여 거대한 데이터에 대한 프로세스 속도를 늦추므로 모든 사람이 사용하도록 제안합니다 datediff.

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

여기서 달력은 테이블이고 시작 날짜 변수는 dt이고 종료 날짜 변수는 dt2입니다.


0

예를 들어 날짜에 '1 MonthName 2015'구문을 사용하고 싶습니다.

   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')

>=전체 시작 날짜를 <포함하고 종료 날짜를 제외하는 논리 이므로 종료 날짜에 하나의 단위를 추가합니다. 예를 들어 다음과 같이 몇 개월 동안 적용 할 수 있습니다.

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

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

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
이 상황에서 Stored-Procedure를 사용하면 SQL 쿼리의 유연성이 엄청나게 줄어들 기 때문에 의미가 없습니다. 매우 구체적인 상황에서 사용하지 않으려는 경우에는 사용하지 마십시오. 스토어드 프로 시저-또한이 커뮤니티에서 찾을 수있는 스토어드 프로 시저에 대한 많은 개선 사항이 있습니다.
shA.t

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