2012-03-22 15 views
1

環境的有效日期:微軟SQL Server 2005中,給予2008年得到3列

IF object_id('tempdb..#MyTempTable') IS NOT NULL 
BEGIN 
    DROP TABLE #MyTempTable 
END 

CREATE TABLE #MyTempTable 
(
    ID int IDENTITY(1,1) 
    , date1 datetime 
    , date2 datetime 
    , date3 datetime 
) 
INSERT INTO #MyTempTable 
SELECT '3/1/2012','3/2/2012',NULL 

table datetest 
id,date1,date2,date3 
------------------------ 
1, 3/1/2012,3/2/2012,null 
2, 3/1/2012,null,null 

所有3日期可以爲空,可以輸入最多3個日期。

你如何得到最近的日期?

例如,如果date1和date2是爲一行填寫的,那麼如何獲得該行的2列的最近日期?

+0

使用嵌套case語句的日期與IFNULL設置比較他們少了一個比其他日期。一個很好的例子是在http://stackoverflow.com/questions/505747/best-way-to-do-nested-case-statement-logic-in-sql-server – 2012-03-22 18:04:23

回答

4

這適用於SQL Server 2008

DECLARE @MyTempTable 
TABLE (
    ID int IDENTITY(1,1) 
    , date1 datetime 
    , date2 datetime 
    , date3 datetime 
) 

INSERT INTO @MyTempTable 
SELECT '3/1/2012','3/2/2012',NULL 

SELECT [id], (SELECT Max(Dt) FROM (VALUES (date1),(date2),(date3)) AS value(Dt)) as [RecentDate] 
FROM @MyTempTable 
+0

哇!那很棒!從我這裏開始 – 2012-03-22 18:10:17

+0

+1做得好,在其他地方會很有用:D – Andomar 2012-03-22 19:06:03

0

你可以使用子查詢規範化表:

select id 
,  max(date_column) 
from (
     select id 
     ,  date1 as date_column 
     from @MyTempTable 
     union all 
     select id 
     ,  date2 
     from @MyTempTable 
     union all 
     select id 
     ,  date3 
     from @MyTempTable 
     ) as NormalizedTable 

(對於生產,使用呸的答案:-))

0

對於SQL Server 2008,你可以做到以下幾點:

SELECT ID, MIN(dates) MinDate, MAX(dates) MaxDate 
FROM #MyTempTable A 
CROSS APPLY (SELECT * FROM (VALUES (date1), 
            (date2)) VAL(dates)) B 
GROUP BY ID 
0

試試這個:

; WITH CTE AS (
    SELECT 
     ID, 
     ISNULL(date1, CAST(0 AS DATETIME)) AS date1, 
     ISNULL(date2, CAST(0 AS DATETIME)) AS date2, 
     ISNULL(date3, CAST(0 AS DATETIME)) AS date3 
    FROM #MyTempTable 
) 
SELECT 
    ID, 
    NULLIF(
     CASE 
      WHEN date1 > date2 THEN 
       CASE WHEN date1 > date3 THEN date1 ELSE date3 END 
      ELSE 
       CASE WHEN date2 > date3 THEN date2 ELSE date3 END 
     END, 
     CAST(0 AS DATETIME)) 

FROM CTE 
1

最近有這個問題。正在試圖找到一個相當於oracle中的GREATEST函數,這將在一個捏,但發現在SQL Server中沒有等效。

發現使用透視一個很好的解決方案,這種類型的問題 http://social.msdn.microsoft.com/Forums/is/transactsql/thread/d5583d1e-df78-4552-80e9-c63cfe0eb0c3

SELECT id, max(dt) as max_date 
FROM #MyTempTable 
unpivot(dt FOR columnname in ([date1],[date2],[date3])) AS pv 
GROUP BY id 
+0

此解決方案適用於Sql Server 2005和Sql Server 2008 – rlobban 2012-03-23 17:40:24