una ultimo ultima traer tabla seleccionar registro reciente por obtener mayor mas fecha con antigua sql database sql-server-2005

ultimo - sql seleccionar registro mayor fecha



Seleccionando la fecha más reciente entre dos columnas (12)

AFAIK, no hay una función incorporada para obtener el máximo de dos valores, pero puede escribir los suyos fácilmente como:

CREATE FUNCTION dbo.GetMaximumDate(@date1 DATETIME, @date2 DATETIME) RETURNS DATETIME AS BEGIN IF (@date1 > @date2) RETURN @date1 RETURN @date2 END

y llámalo como

SELECT Id, dbo.GetMaximumDate(Date1, Date2) FROM tableName

Si tengo una tabla que (entre otras columnas) tiene dos columnas DATETIME, ¿cómo seleccionaría la fecha más reciente de esas dos columnas?

Ejemplo:

ID Date1 Date2 1 1/1/2008 2/1/2008 2 2/1/2008 1/1/2008 3 1/10/2008 1/10/2008

Si quisiera que mis resultados se vean como

ID MostRecentDate 1 2/1/2008 2 2/1/2008 3 1/10/2008

¿Hay una manera simple de hacer esto que obviamente estoy pasando por alto? Sé que puedo hacer subconsultas y declaraciones de casos o incluso escribir una función en el servidor sql para manejarlo, pero tenía en mi cabeza que había una función de tipo de comparación máxima ya incorporada de la que me olvido.


Aparte de la declaración del caso, no lo creo ...

Select Case When DateColA > DateColB Then DateColA Else DateColB End MostRecent From Table ...


Puede incluir esto en una función escalar, lo que simplifica el manejo de nulos. Obviamente, no va a ser más rápido que el enunciado de caso en línea.

ALTER FUNCTION [fnGetMaxDateTime] ( @dtDate1 DATETIME, @dtDate2 DATETIME ) RETURNS DATETIME AS BEGIN DECLARE @dtReturn DATETIME; -- If either are NULL, then return NULL as cannot be determined. IF (@dtDate1 IS NULL) OR (@dtDate2 IS NULL) SET @dtReturn = NULL; IF (@dtDate1 > @dtDate2) SET @dtReturn = @dtDate1; ELSE SET @dtReturn = @dtDate2; RETURN @dtReturn; END


Siempre que sea posible, use las funciones InLine ya que no sufren ninguno de los problemas de rendimiento generalmente asociados con las UDF ...

Create FUNCTION MaximumDate ( @DateTime1 DateTime, @DateTime2 DateTime ) RETURNS TABLE AS RETURN ( Select Case When @DateTime1 > @DateTime2 Then @DateTime1 Else @DateTime2 End MaxDate ) GO

Para las pautas de uso, mira Aquí


select ID, case when Date1 > Date2 then Date1 else Date2 end as MostRecentDate from MyTable


Todas las demás respuestas correctas ya publicadas.

Pero si aún busca la palabra clave MAX, aquí tiene una forma:

select ID , MAX(dt) from ( select Id , Date1 as dt from table1 union select ID , Date2 from table2 ) d group by d.Id


¿Por qué no puedes usar la función MÁS GRANDE?

select id, date1, date2, GREATEST( nvl(date1,date2) , nvl(date2, date1) ) from table1;

Incluí un NVL para garantizar que NULL se evaluó correctamente; de ​​lo contrario, si Date1 o Date2 son nulos, Greatest devuelve NULL.

ID Date1 Date2 MostRecentDate 1 1/1/2008 2/1/2008 2/1/2008 2 2/1/2008 1/1/2008 2/1/2008 3 1/10/2008 1/10/2008 1/10/2008 4 -null- 2/10/2008 2/10/2008 5 2/10/2008 -null- 2/10/2008


Creo que la respuesta aceptada es la más simple. Sin embargo, me gustaría ver valores nulos en las fechas ...

SELECT ID, CASE WHEN ISNULL(Date1,''01-01-1753'') > ISNULL(Date2,''01-01-1753'') THEN Date1 ELSE Date2 END AS MostRecentDate FROM Table


select max(d) ChangeDate from (values(@d), (@d2)) as t(d)


Este hilo tiene varias soluciones. Si tenía más de 2 fechas para comparar, "unpivot" podría ser preferible a escribir una serie de declaraciones de casos. Lo siguiente es descaradamente robado de Niikola :

select id, max(dDate) MostRecentDate from YourTable unpivot (dDate for nDate in (Date1, Date2, Date3)) as u group by id

Luego puede order by dDate , si eso es útil.


CASE es en mi humilde opinión su mejor opción:

SELECT ID, CASE WHEN Date1 > Date2 THEN Date1 ELSE Date2 END AS MostRecentDate FROM Table

Si una de las columnas es nulable, solo tiene que adjuntar en COALESCE :

.. COALESCE(Date1, ''1/1/1973'') > COALESCE(Date2, ''1/1/1973'')


Desde SQL Server 2012 es posible usar el acceso directo IIF a la expresión CASE , aunque este último es SQL Standard:

SELECT ID, IIF(DateColA > DateColB, DateColA, DateColB) AS MostRecentDate FROM theTable