2013-07-21 55 views
0

我有這個簡單的數據基礎:最偉大的日期

2013年7月2日

2013年7月13日

我寫一個簡單的SQL語句來選擇最大的日期日期列表。我嘗試使用(最大功能)如下:

select max([P_Date]) from [BalDB].[dbo].[tab_Product] 

結果是不正確的;它給了我最小的日期,而不是最大如下:

7/2/2013 

所以,請大家幫我知道什麼是我的SQL語句的問題,我怎麼能解決這個問題 問題:從列表中得到最大的日期日期或與當地日期比較,並採取更大的!

+6

該列的類型是什麼?它看起來像'max()'將它看作是一個字符值,而不是日期值。 – David

+0

YEAH IT is nvarchar(50)!!! – Emperor

+1

那麼這是有原因的。它根據數據的類型正確返回最大值。這裏最好的方法是將保存日期的列更改爲日期類型,以便數據庫引擎可以相應地優化它。如果這是不可能的,那麼查詢將不得不將這些值即時轉換爲日期值。 – David

回答

2

在SQL max函數返回所選擇的列的最大值,在你的情況下,由於數據類型是nvarchar最大值是什麼是按字母順序變大,在這種情況下是7/2/2013(因爲「2」大於「13」中的「1」)。

你需要做的基本上是@David提到的東西,無論是偶然列的數據類型,或者是不可行的,那麼你可以在查詢中投它作爲一個datetime

例如

select max(cast([P_Date] as datetime)) from [BalDB].[dbo].[tab_Product] 
+0

有用的方法來解決這個問題!! 謝謝兩位@Jack和大衛對我的幫助:d – Emperor

+0

是否有可能從日期時間的格式轉換:2013年7月13日00:00:00.000排序日期時間:2013年7月13日???? – Emperor

+0

是的,這取決於數據庫系統(以及哪個版本),你可以將其轉換爲一個日期,而不是日期時間或者你可以將其格式化之後截斷一部分時間。 – Jack

0

最大的功能是讓這個比需要慢,試試這個。

select top 1 convert(datetime,P_Date) from [BalDB].[dbo].[tab_Product] order by convert(datetime,P_Date) desc 

現在您的日期應是日期類型,而不是VARCHAR處理,但由於在查詢數據的緣故,這將工作。

+1

MAX()真的比ORDER BY plus行限制器慢嗎?你有證據嗎?他們應該優化到同樣的事情(我不經常使用SQL Server)。 – Ben

+0

@Ben我不是說OP實際上說了他們使用的是什麼數據庫系統。這就是說我想知道同樣的事情。 – Jack

+0

是否有可能將日期時間的格式從:2013-07-13 00:00:00.000轉換爲排序日期時間:2013-07-13 ???? – Emperor