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