una separar por obtener nombre mes fecha extraer ejemplo como año actual sql sql-server sql-server-2005 tsql

separar - obtener el nombre del dia en sql server



Crear una fecha del día mes y año con T-SQL (14)

Agrego una solución de una línea si necesita una fecha y hora de las partes de fecha y hora :

select dateadd(month, (@Year -1900)*12 + @Month -1, @DayOfMonth -1) + dateadd(ss, @Hour*3600 + @Minute*60 + @Second, 0) + dateadd(ms, @Millisecond, 0)

Estoy intentando convertir una fecha con partes individuales como 12, 1, 2007 en una fecha y hora en SQL Server 2005. He intentado lo siguiente

CAST(DATEPART(year, DATE)+''-''+ DATEPART(month, DATE) +''-''+ DATEPART(day, DATE) AS DATETIME)

pero esto resulta en la fecha incorrecta. ¿Cuál es la forma correcta de convertir los tres valores de fecha en un formato de fecha y hora adecuado?


Es más seguro y sencillo utilizar un punto de inicio explícito ''19000101''

create function dbo.fnDateTime2FromParts(@Year int, @Month int, @Day int, @Hour int, @Minute int, @Second int, @Nanosecond int) returns datetime2 as begin -- Note! SQL Server 2012 includes datetime2fromparts() function declare @output datetime2 = ''19000101'' set @output = dateadd(year , @Year - 1900 , @output) set @output = dateadd(month , @Month - 1 , @output) set @output = dateadd(day , @Day - 1 , @output) set @output = dateadd(hour , @Hour , @output) set @output = dateadd(minute , @Minute , @output) set @output = dateadd(second , @Second , @output) set @output = dateadd(ns , @Nanosecond , @output) return @output end


Intenta esta consulta:

SELECT SUBSTRING(CONVERT(VARCHAR,JOINGDATE,103),7,4)AS YEAR,SUBSTRING(CONVERT(VARCHAR,JOINGDATE,100),1,2)AS MONTH,SUBSTRING(CONVERT(VARCHAR,JOINGDATE,100),4,3)AS DATE FROM EMPLOYEE1

Resultado:

2014 Ja 1 2015 Ja 1 2014 Ja 1 2015 Ja 1 2012 Ja 1 2010 Ja 1 2015 Ja 1


O usando una sola función dateadd:

DECLARE @day int, @month int, @year int SELECT @day = 4, @month = 3, @year = 2011 SELECT dateadd(mm, (@year - 1900) * 12 + @month - 1 , @day - 1)


Para versiones de SQL Server a continuación 12 puedo recomendar el uso de CAST en combinación con SET DATEFORMAT

-- 26 February 2015 SET DATEFORMAT dmy SELECT CAST(''26-2-2015'' AS DATE) SET DATEFORMAT ymd SELECT CAST(''2015-2-26'' AS DATE)

Cómo crear esas cadenas depende de ti


Personalmente, prefiero la subcadena, ya que proporciona opciones de limpieza y la capacidad de dividir la cadena según sea necesario. El supuesto es que los datos tienen el formato ''dd, mm, aaaa''.

--2012 and above SELECT CONCAT ( RIGHT(REPLACE(@date, '' '', ''''), 4) ,''-'' ,RIGHT(CONCAT(''00'',SUBSTRING(REPLACE(@date, '' '', ''''), CHARINDEX('','', REPLACE(@date, '' '', '''')) + 1, LEN(REPLACE(@date, '' '', '''')) - CHARINDEX('','', REPLACE(@date, '' '', '''')) - 5)),2) ,''-'' ,RIGHT(CONCAT(''00'',SUBSTRING(REPLACE(@date, '' '', ''''), 1, CHARINDEX('','', REPLACE(@date, '' '', '''')) - 1)),2) ) --2008 and below SELECT RIGHT(REPLACE(@date, '' '', ''''), 4) +''-'' +RIGHT(''00''+SUBSTRING(REPLACE(@date, '' '', ''''), CHARINDEX('','', REPLACE(@date, '' '', '''')) + 1, LEN(REPLACE(@date, '' '', '''')) - CHARINDEX('','', REPLACE(@date, '' '', '''')) - 5),2) +''-'' +RIGHT(''00''+SUBSTRING(REPLACE(@date, '' '', ''''), 1, CHARINDEX('','', REPLACE(@date, '' '', '''')) - 1),2)

Aquí hay una demostración de cómo se puede demandar si los datos se almacenan en una columna. No hace falta decir que es ideal para verificar el conjunto de resultados antes de aplicar a la columna

DECLARE @Table TABLE (ID INT IDENTITY(1000,1), DateString VARCHAR(50), DateColumn DATE) INSERT INTO @Table SELECT''12, 1, 2007'',NULL UNION SELECT''15,3, 2007'',NULL UNION SELECT''18, 11 , 2007'',NULL UNION SELECT''22 , 11, 2007'',NULL UNION SELECT''30, 12, 2007 '',NULL UPDATE @Table SET DateColumn = CONCAT ( RIGHT(REPLACE(DateString, '' '', ''''), 4) ,''-'' ,RIGHT(CONCAT(''00'',SUBSTRING(REPLACE(DateString, '' '', ''''), CHARINDEX('','', REPLACE(DateString, '' '', '''')) + 1, LEN(REPLACE(DateString, '' '', '''')) - CHARINDEX('','', REPLACE(DateString, '' '', '''')) - 5)),2) ,''-'' ,RIGHT(CONCAT(''00'',SUBSTRING(REPLACE(DateString, '' '', ''''), 1, CHARINDEX('','', REPLACE(DateString, '' '', '''')) - 1)),2) ) SELECT ID,DateString,DateColumn FROM @Table


Prueba esto:

Declare @DayOfMonth TinyInt Set @DayOfMonth = 13 Declare @Month TinyInt Set @Month = 6 Declare @Year Integer Set @Year = 2006 -- ------------------------------------ Select DateAdd(day, @DayOfMonth - 1, DateAdd(month, @Month - 1, DateAdd(Year, @Year-1900, 0)))

Funciona igual de bien, ha agregado el beneficio de no realizar conversiones de cadenas, por lo que es un procesamiento aritmético puro (muy rápido) y no depende de ningún formato de fecha. Esto aprovecha el hecho de que la representación interna de SQL Server para datetime y smalldatetime es dos. parte del valor, cuya primera parte es un número entero que representa el número de días desde el 1 de enero de 1900, y la segunda parte es una fracción decimal que representa la parte fraccionaria de un día (para el tiempo) --- Por lo tanto, el valor entero 0 (cero ) siempre se traduce directamente a la medianoche de la mañana del 1 de enero de 1900 ...

o, gracias a la sugerencia de @brinary,

Select DateAdd(yy, @Year-1900, DateAdd(m, @Month - 1, @DayOfMonth - 1))

Editado en octubre de 2014. Tal como lo señaló @cade Roux, SQL 2012 ahora tiene una función integrada:
DATEFROMPARTS(year, month, day)
Eso hace lo mismo.

Editado el 3 de octubre de 2016, (Gracias a @bambams por darse cuenta de esto, y @brinary por solucionarlo), La última solución, propuesta por @brinary. no parece funcionar durante años bisiestos a menos que los años adicionales se realicen primero

select dateadd(month, @Month - 1, dateadd(year, @Year-1900, @DayOfMonth - 1));


Pruebe CONVERTIR en lugar de CAST.

CONVERTIR permite un tercer parámetro que indica el formato de fecha.

La lista de formatos se encuentra aquí: http://msdn.microsoft.com/en-us/library/ms187928.aspx

Actualizar después de que otra respuesta haya sido seleccionada como la respuesta "correcta":

Realmente no entiendo por qué se selecciona una respuesta que depende claramente de la configuración de NLS en su servidor, sin indicar esta restricción.


SQL Server 2012 tiene una maravillosa y esperada nueva función DATEFROMPARTS (que generará un error si la fecha no es válida; mi principal objeción a una solución basada en DATEADD para este problema):

http://msdn.microsoft.com/en-us/library/hh213228.aspx

DATEFROMPARTS(ycolumn, mcolumn, dcolumn)

o

DATEFROMPARTS(@y, @m, @d)


Si no quieres mantener cadenas fuera de esto, esto también funciona (ponlo en una función):

DECLARE @Day int, @Month int, @Year int SELECT @Day = 1, @Month = 2, @Year = 2008 SELECT DateAdd(dd, @Day-1, DateAdd(mm, @Month -1, DateAdd(yy, @Year - 2000, ''20000101'')))


Sql Server 2012 tiene una función que creará la fecha basada en las partes ( DATEFROMPARTS ). Para el resto de nosotros, aquí hay una función de db que creé que determinará la fecha de las partes (gracias @Charles) ...

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N''[dbo].[func_DateFromParts]'')) DROP FUNCTION [dbo].[func_DateFromParts] GO CREATE FUNCTION [dbo].[func_DateFromParts] ( @Year INT, @Month INT, @DayOfMonth INT, @Hour INT = 0, -- based on 24 hour clock (add 12 for PM :) @Min INT = 0, @Sec INT = 0 ) RETURNS DATETIME AS BEGIN RETURN DATEADD(second, @Sec, DATEADD(minute, @Min, DATEADD(hour, @Hour, DATEADD(day, @DayOfMonth - 1, DATEADD(month, @Month - 1, DATEADD(Year, @Year-1900, 0)))))) END GO

Puedes llamarlo así ...

SELECT dbo.func_DateFromParts(2013, 10, 4, 15, 50, DEFAULT)

Devoluciones...

2013-10-04 15:50:00.000


Suponiendo que y, m, d son todos int , ¿qué hay de:

CAST(CAST(y AS varchar) + ''-'' + CAST(m AS varchar) + ''-'' + CAST(d AS varchar) AS DATETIME)

Por favor vea mi otra respuesta para SQL Server 2012 y superior


También puedes usar

select DATEFROMPARTS(year, month, day) as ColDate, Col2, Col3 From MyTable Where DATEFROMPARTS(year, month, day) Between @DateIni and @DateEnd

Funciona en SQL desde ver.2012 y AzureSQL


Tratar

CAST(STR(DATEPART(year, DATE))+''-''+ STR(DATEPART(month, DATE)) +''-''+ STR(DATEPART(day, DATE)) AS DATETIME)