Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取3列的有效日期_Sql_Sql Server - Fatal编程技术网

Sql 获取3列的有效日期

Sql 获取3列的有效日期,sql,sql-server,Sql,Sql Server,环境:MicrosoftSQLServer20052008 鉴于: 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 #My

环境:MicrosoftSQLServer20052008

鉴于:

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列中的最新日期?

您可以使用子查询规范化该表:

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

对于生产,请使用Yuck的答案:-

您可以使用子查询规范化表:

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

对于生产,请使用Yuck的答案:-

对于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

对于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

这适用于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

这适用于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
试试这个:

; 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
试试这个:

; 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

最近有这个问题。他试图找到一个与oracle中最强大的功能相当的功能,在紧要关头可以做到这一点,但发现在SQL Server中没有类似的功能

找到了使用pivot解决此类问题的好方法


最近有这个问题。他试图找到一个与oracle中最强大的功能相当的功能,在紧要关头可以做到这一点,但发现在SQL Server中没有类似的功能

找到了使用pivot解决此类问题的好方法


使用嵌套的case语句将日期与ifnull进行比较,并将其设置为比另一个日期小一个。一个很好的例子是使用嵌套的case语句将日期与ifnull进行比较,将它们设置为比另一个日期小一个。一个很好的例子就是魔兽世界!太好了!从我这里上来哇!太好了!此解决方案适用于Sql Server 2005和Sql Server 2008。此解决方案适用于Sql Server 2005和Sql Server 2008