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


303

나는이 start_date와 end_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.