2009-07-01 8 views

답변

1
SELECT * from table WHERE LOGTS > '2009-01-01'; 

작품입니다. 외삽. 또한 캐스팅 할 수 있습니다.

SELECT CAST('1900-01-04 00:00' AS datetime); 

여기서 T-SQL을 사용하여 SQL Server를 가정합니다. 그들은 현재 시간을 얻고 부정적인 7 일을 추가하는 것과 같은 것을하기 위해 functions을 가지고 있습니다.

SELECT * from table WHERE logts > DATEADD(day, -7, CURRENT_TIMESTAMP); 

또한 LOGTS 열을 색인화하면 도움이됩니다.

그리고 위 쿼리의 실행 계획을 아래의 쿼리와 비교할 때 위와 같은 쿼리가 더 간단하고 빠르다는 것을 알게 될 것입니다.

SELECT * FROM aTable WHERE DATEDIFF(week, LOGTS, GETDATE()) <= 2 
0

dlamblin의 대답은 좋은 시작입니다. 대부분의 데이터베이스에는 getdate() 함수와 찾고있는 오프셋을 만드는 데 사용할 수있는 dateadd() 함수가 있습니다. getdate()의 결과를 변수에 저장 한 다음 dateadd()를 사용하여 현재 날짜를 기준으로 범위를 만듭니다.

쿼리에서 "between"연산자 또는 단순보다 큰 /보다 작음 연산자를 사용하여 데이터를 쿼리 할 수 ​​있습니다.

+0

BETWEEN에 대한 참고 사항 : 일부 (대부분? all?) 구현은 포괄적입니다. 자정 값으로 예기치 않은 결과가 발생할 수 있습니다. 저장하고 비교하는 날짜/시간 값의 세분성에 따라 다릅니다. 문제가있는 경우보다 큼 /보다 작음 연산자를 사용하는 것이 좋습니다. – TSomKes

+0

그래, 좋은 지적이야, 나는 동의한다. –

1

지난 주부터 오늘까지의 데이터가 필요합니다. 이 경우 작동해야합니다.

SELECT * FROM aTable WHERE DATEDIFF(week, LOGTS, GETDATE()) <= 2 

여기에서 2 주 전부터 지금까지 데이터를 선택합니다.

0
SELECT * FROM myData 
where LOGTS > dateadd(day,-7,current_date()) 

오늘 날짜부터 과거 7 일입니다.

dateadd(day,-7,current_date()) 구문을 데이터베이스 풍미에있는 sysdate 분 7 일 구문이 무엇이든 변경하십시오.

1

명백한 DATEADDDATEDIFF은 일 또는 주 시작 시간 (예 : 자정 일요일 또는 월요일 오전 8시)과 일치해야하는 시간 구성 요소를 종종 잊어 버립니다. 그렇지 않으면 첫날의 이전 행이 누락됩니다. (예를 들어, 오전 9시와 오후 2시에 달리면 다른 결과를 보임).

이 반올림 계산은 시간에 여러 지점을 발견 할 것이다 : 당신의 요구에 따라서

SET NOCOUNT ON; 
DECLARE @pointInTime datetime; 
SET @pointInTime= GETDATE(); 

SELECT 
    @@DATEFIRST AS FirstDayOfWeek, 
    DATEADD(hour, DATEDIFF(hour, 0, @pointInTime), 0) AS StartOfHour, 
    DATEADD(day, DATEDIFF(day, 0, @pointInTime), 0) AS StartOfDay, 
    DATEADD(day, DATEDIFF(day, 1, @pointInTime), 0) AS Yesterday, 
    DATEADD(day, DATEDIFF(day, -1, @pointInTime), 0) AS Tomorrow, 
    DATEADD(day, 1 - DATEPART(weekday, @pointInTime), DATEADD(day, 
      DATEDIFF(day, 0, @pointInTime), 0)) AS StartOfThisWeek, 
    DATEADD(day, 1 - DATEPART(weekday, @pointInTime), DATEADD(day, 
      DATEDIFF(day, 7, @pointInTime), 0)) AS StartOfPreviousWeek, 
    DATEADD(month, DATEDIFF(month, 0, @pointInTime), 0) AS StartOfMonth, 
    DATEADD(quarter, DATEDIFF(quarter, 0, @pointInTime), 0) AS StartOfQuarter, 
    DATEADD(year, DATEDIFF(year, 0, @pointInTime), 0) AS StartOfYear, 
    DATEADD(hour, 8, DATEADD(day, DATEDIFF(day, 0, 
      @pointInTime), 0)) AS StartOfBusinessDay_8am, 
    DATEADD(month, 6, DATEADD(year, DATEDIFF(year, 0, 
      @pointInTime), 0)) AS StartOfFiscalYear_July1st; 

"이번 주"에 대한 비교를, 주 가정은 자정 일요일에 시작 :

SELECT * FROM MyTable WHERE 
    (LOGTS >= DATEADD(day, 1 - DATEPART(weekday, GETDATE()), 
      DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)) 

이것은 또한 LOGTS가 현지 시간을 사용한다고 가정합니다. GMT/UTC를 사용하는 경우 GETDATE()를 GETUTCDATE()로 변경하십시오.

개인적으로 나는 날짜 계산을 변수에 할당하고이를 비교에 직접 사용합니다. 조금 더 깨끗해 보인다.

또한범위는 반올림 범위를 사용하여 비교하여 두 번째 부분 반올림 문제를 방지해야합니다. 즉 시작/이전 시간보다 크거나 같고 종료 시간/새 시간보다 작지는 않습니다 (작거나 같지 않음). BETWEEN은 여기서 작동하지 않습니다. 그래서 위의 이름 값을 사용하여 범위 "지난 주"의 기록에 대한

:

SELECT ... WHERE (LOGTS >= StartOfPreviouWeek) AND (LOGTS < StartOfThisWeek); 

등등. 특정 데이터베이스 엔진에 대한

관련 문제