2009-07-01 145 views

回答

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

的作品。推斷。你也可以投它:

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

我假設SQL Server在這裏與T-SQL。他們有functions這樣做的東西,比如獲取當前時間和增加負值7天。

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:一些(?最重要)的實現是包容性。根據您存儲和比較的日期/時間值的粒度,午夜值可能會產生意外結果。 如果這是一個問題,大於/小於號運營商可能是要走的路。 – TSomKes 2009-07-01 04:45:36

1

看來,你需要從過去的幾周x直到今天的數據。如果是這樣,這應該工作:

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()。

就我個人而言,我會將日期計算分配給變量,並直接在比較中使用它們;看起來有點乾淨。

此外,任何datetime範圍應當使用半開區間,以避免分數第二圓問題進行比較;即大於或等於開始/較舊時間,小於(不小於或等於)結束/較新時間。 BETWEEN在這裏不起作用。

所以對於「上週」範圍中的記錄,使用上面的命名值:

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

等。