2009-12-01 35 views
1

有編寫一個查詢相當於的Sql速記日期

select * from log_table where dt >= 'nov-27-2009' and dt < 'nov-28-2009'; 

的方式,但在這裏你只能指定1日起,說你要爲整個一天,直到下一個結果。

我只是在做這件事,但形式的東西:

select * from log_table where dt = 'nov-27-2009':+1; 
+2

什麼是數據庫供應商? – 2009-12-01 21:46:51

回答

2

我不相信有一種方法可以移植到所有RDBMS中。

我的一個參考文獻(SQL Cookbook)中的一個檢查表明沒有一個RDBMS以相同的方式解決問題。我建議查看該書的第8章,其中介紹了DB2,Oracle,PostgreSQL,MySQL的所有不同方法。

我不得不處理這個問題SQLite,雖然和SQL食譜並沒有解決RDBMS,所以在這裏我要提這件事了一下。 SQLite沒有日期/時間數據類型;您必須通過將所有日期/時間數據存儲爲TEXT來創建自己的應用程序,並確保您的應用程序執行其格式設置。 SQLite確實有一組date/time conversion functions,它們允許您在將數據保持爲字符串的同時添加標稱日期/時間。但是,如果您需要爲對方添加兩個時間段(HH:MM:SS),則根據您存儲在文本列中的數據(您將其視爲日期/時間數據),則必須使用write your own functions(搜索對於「定義SQLite用戶函數」),並在運行時通過調用sqlite3_create_function()將它們附加到數據庫。如果你想要一些添加時間值的用戶函數的例子,請告訴我。

0

對於MS SQL Server中,檢查出DATEPART

/* dy = Day of Year */ 
select * from log_table where datepart(dy, dt) = datepart(dy, '2009-nov-27'); 
+1

這是特定於SQL Server的。大多數其他數據庫具有相同的功能來操作日期。 – 2009-12-01 21:47:24

+1

對數據庫列執行功能通常會限制查詢優化器使用該列上的任何索引。(優化器總是變得更聰明,所以這可能會改變,Oracle允許定義基於功能的索引來處理這個問題。) – 2009-12-01 21:51:35

0

使用SQL Server,你可以

Select * From table 
    Where dt >= DateAdd(day, DateDiff(day, 0, @ParamDate), 0) 
     And dt < DateAdd(day, DateDiff(day, 0, @ParamDate), 1) 
0

只要你正在處理各數據類型的日期數據類型,下面的工作:

t.date_column + 1 

...會給指定的日期添加一天。但我還沒有找到一個允許將隱式數據類型轉換爲日期的數據庫。

SELECT '12-10-2009' + 1 

...將SQL Server上的失敗,因爲比較日期時間數據類型列時SQL Server只執行隱式轉換。所以,你需要使用:

SELECT CONVERT(DATETIME, '12-10-2009') + 1 

對於Oracle,你必須使用TO_DATE功能; MySQL會使用類似STR_TO_DATE等。

0

有一列只包含日期部分(時間是00:00:00.000),然後您可以添加一個where子句:WHERE dt ='2009-11-27'