Microsoft SQL Server에서 날짜 만 사용하여 DATETIME 필드를 쿼리하는 방법은 무엇입니까?


88

다음과 같이 DATETIME필드 가있는 테이블 TEST가 있습니다 .

ID NAME DATE
1 TESTING 2014-03-19 20:05:20.000

시간에 관계없이이 행과 2014 년 3 월 19 일 날짜가있는 모든 행을 반환하는 쿼리가 필요합니다. 나는 사용해 보았다

select * from test where date = '03/19/2014';

그러나 행을 반환하지 않습니다. 내가 찾은 유일한 방법은 날짜의 시간 부분도 제공하는 것입니다.

select * from test where date = '03/19/2014 20:03:02.000';

답변:


126

범위 또는 DateDiff 함수 사용

 select * from test 
 where date between '03/19/2014' and '03/19/2014 23:59:59'

또는

 select * from test 
 where datediff(day, date, '03/19/2014') = 0

다른 옵션은 다음과 같습니다.

  1. 데이터베이스 스키마를 제어 할 수 있고 시간 데이터가 필요하지 않은 경우 제거하십시오.

  2. 또는 유지해야하는 경우 날짜 값의 시간 부분이 제거 된 계산 된 열 속성을 추가합니다.

Alter table Test Add DateOnly As DateAdd(day, datediff(day, 0, date), 0)

또는 최신 버전의 SQL Server에서 ...

Alter table Test Add DateOnly As Cast(DateAdd(day, datediff(day, 0, date), 0) as Date)

그런 다음 쿼리를 다음과 같이 작성할 수 있습니다.

select * from test 
where DateOnly = '03/19/2014'

좋아, 작동하지만 더 쉬운 방법이 있는지 궁금합니다.
delphirules

음, 유일한 다른 쉬운 방법은 처음에 시간 데이터를 데이터베이스에 넣지 않는 것입니다 ... 또는 시간 부분을 제거하고 사용하는 계산 된 속성을 생성하는 것입니다 ... 두 옵션을 내 대답에 추가했습니다.
Charles Bretana

나는 DATEDIFF 메서드가 2014 년 4 월 19 일 또는 2015 년 3 월 19 일과 같은 날짜에 대해 참 (바람직하지 않게)을 반환 할 것이라고 우려했습니다. 해당 날짜의 '일'부분이 동일하기 때문입니다. 이런 식으로 행동)하지만 데이터베이스에 대해 테스트했으며 올바르게 작동하는 것 같습니다.
mono código

예, DateDiff()함수는 모든 변형에서 한 날짜를 다른 날짜로 가져 오기 위해 교차해야하는 날짜 경계 의 수를 계산하고 반환하기 때문 입니다. 이것이 왜 DateDiff(day, '1Jan2016', '31Dec2017 23:259:59')그리고 DateDiff(day, '31Dec2016 23:259:59', '1Jan2017 ') 둘 다 반환 1합니다.
Charles Bretana

55

간단한 대답;

select * from test where cast ([date] as date) = '03/19/2014';

이것이 유효한 대답이지만 모든 기능 뒤에 날짜 필드를 입력하면 성능 문제가 발생할 수 있음을 지적하고 싶습니다. 날짜의 모든 인덱스는 쓸모가 없으며 엔진은 각 행을 평가해야합니다
jean


7
select * from test 
where date between '03/19/2014' and '03/19/2014 23:59:59'

이것은 정말 나쁜 대답입니다. 두 가지 이유가 있습니다.

1. 23.59.59.700 등과 같은 시간에 어떤 일이 발생합니까? 23:59:59보다 큰 시간과 다음 날이 있습니다.

2. 동작은 데이터 유형에 따라 다릅니다. 쿼리는 datetime / date / datetime2 유형에 대해 다르게 작동합니다.

23 : 59 : 59.999로 테스트하면 날짜 유형에 따라 다른 반올림이 발생하기 때문에 더욱 악화됩니다.

select convert (varchar(40),convert(date      , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime  , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime2 , '2014-03-19 23:59:59.999'))

-날짜 값은 '잘게 썬 것'입니다. -datetime의 경우 값은 다음 날짜로 반올림됩니다. (가장 가까운 값). -datetime2의 경우 값이 정확합니다.


7

이것은 MS SQL 서버에서 나를 위해 작동합니다.

select * from test
where 
year(date) = 2015
and month(date) = 10
and day(date)= 28 ;

1

이 시도

 select * from test where Convert(varchar, date,111)= '03/19/2014'

1

당신은 이것을 시도 할 수 있습니다

select * from test where DATEADD(dd, 0, DATEDIFF(dd, 0, date)) = '03/19/2014';

1
감사합니다.하지만 더 간단한 해결책은 이전 해결책과 마찬가지로 시간과의 비교라고 생각합니다.
delphirules

0

시간 부분을 자르는 다음 접근 방식을 사용할 수 있습니다.

select * from test
where convert(datetime,'03/19/2014',102) = DATEADD(dd, DATEDIFF(dd, 0, date), 0)

0
-- Reverse the date format
-- this false:
    select * from test where date = '28/10/2015'
-- this true:
    select * from test where date = '2015/10/28'

1
답변에 대한 설명을 추가하십시오!
ρss

'2015/10/28 00 : 00.001'이 '2015/10/28'과 다르기 때문에 작동하지 않습니다
PedroC88

0

귀하의 WHERE조항에 이것을 사용하십시오 .

아래의 "SubmitDate"부분은 열 이름이므로 직접 입력하십시오.

결과의 "Year"부분 만 반환하고 분 등은 생략합니다.

Where datepart(year, SubmitDate) = '2017'

0
select *, cast ([col1] as date) <name of the column> from test where date = 'mm/dd/yyyy'

"col1"은 날짜와 시간
이있는 열의 이름입니다. 여기서 원하는대로 이름을 변경할 수 있습니다.


0
select *
  from invoice
 where TRUNC(created_date) <=TRUNC(to_date('04-MAR-18 15:00:00','dd-mon-yy hh24:mi:ss'));

0

날짜 및 언어에 문제가 있으며이를 방지하는 방법은 YYYYMMDD 형식의 날짜를 요청하는 것입니다.

아래 링크에 따르면 아래 방법이 가장 빠릅니다. SQL Server 2012를 체크인했으며 링크에 동의합니다.

select * from test where date >= '20141903' AND date < DATEADD(DAY, 1, '20141903');

0

이것을 사용하십시오

select * from TableName where DateTimeField > date() and  DateTimeField < date() + 1

-1

이 쿼리를 테스트하십시오.

SELECT *,DATE(chat_reg_date) AS is_date,TIME(chat_reg_time) AS is_time FROM chat WHERE chat_inbox_key='$chat_key' 
                         ORDER BY is_date DESC, is_time DESC

-1
select * from invoice where TRANS_DATE_D>= to_date  ('20170831115959','YYYYMMDDHH24MISS')
and TRANS_DATE_D<= to_date  ('20171031115959','YYYYMMDDHH24MISS');

나는이 오라클 구문을 생각 SQL 서버에서 작업을하지 않는
ceinmart

-2
SELECT * FROM test where DATEPART(year,[TIMESTAMP]) = '2018'  and  DATEPART(day,[TIMESTAMP]) = '16' and  DATEPART(month,[TIMESTAMP]) = '11'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.