2009-06-10 2 views
1

datetime으로 datetime으로 AttemptDate라는 열을 포함하는 테이블을 쿼리하는 일일 예약 된 작업이 있습니다. 그러나 태스크는 날짜와 상관없이 모든 항목을 조회합니다. 태스크 실행시 아래와 같이 그래서, 모든 날짜의 항목을 출력한다 :datetime (TSQL)로 datetime 열에 현재 날짜 부분의 항목을 얻는 방법

2009-06-06 06:01:30.852 
2009-06-07 01:41:46.719 
2009-06-08 03:58:23.945 

SQL 쿼리는 다음과 같다 :

SELECT AttemptDate from dbo.ChangeAttempt 

dbo.ChangeAttempt 구조는 다음의 표 :

Column   Data Type  Constraints   
------   ---------  ----------- 

EventData  xml    NOT NULL 
AttemptDate  datetime  NOT NULL DEFAULT GETDATE() 
DBUser   char(50)  NOT NULL 

내 질문은 : 기존 TSQL 쿼리에서 Where 절을 추가하면 어떻게 현재 날짜 부분의 항목을 가져 옵니까?

여기에 현재 날짜가 의미하는 것은 TSQL 쿼리가 실행되도록 예약 된 날짜입니다.

추가 : 당신은 당신이 제약에 의해 디폴트 된 항목을 얻는 방법을 요구하는 경우 나에 대해 TSQL 쿼리를 실행하고 SQL 서버 버전은 2005 년

답변

3
SELECT AttemptDate 
FROM dbo.ChangeAttempt 
WHERE AttemptDate >= cast(floor(cast(getdate() as float)) as datetime) 
+0

덕분에 많이. 그것은 작동합니다. – titanium

+2

가장 빠른 방법은 datediff/dateadd 메서드입니다. http://stackoverflow.com/questions/133081/most-efficient-way-in-ms-sql-to-get-date-from-datetime/150722#150722 Itzhak의 SQL Server mag에서 비슷한 테스트를 보았습니다. – gbn

1
SELECT AttemptDate 
FROM dbo.ChangeAttempt 
WHERE DATEDIFF(d, AttemptDate, GetDate()) = 0 
+0

12:00 전에 만 작동합니다. DATEDIFF가 차이를 반올림합니다. – tekBlues

+0

DateDiff는 datepart의 경계를 넘을 때마다 하나씩 추가해야합니다. –

+0

니스,하지만 확실하지> 0입니다. 또한 테이블 열에 함수를 적용하면 모든 인덱스가 사용되지 않으므로 많은 행에서 느려질 것입니다. – gbn

0

입니다

, 그러면 테이블이 어떻게 설정되어 있는지 방법이 없습니다. 시도 날짜를 생략하면 서버가 현재 날짜를 사용하여 기본값으로 설정하고 나중에 테이블 구조를 변경할 수없는 경우 일종의 플래그와 트리거를 사용하여이를 쉽게 수행 할 수 있습니다.

0

내가 먼저 변수에 현재 데이터베이스 날짜를 저장하는 경우 쿼리가 더 잘 수행 할 생각 :

DECLARE @curr_date datetime; 
SET @curr_date = cast(floor(cast(getdate() as float)) as datetime) 
SELECT AttemptDate 
FROM dbo.ChangeAttempt 
WHERE AttemptDate >= @curr_date