tipo obtener insertar hora formato fecha entre ejemplo diferencia dato sql sql-server datetime stored-procedures sql-convert

obtener - Formateo personalizado de fecha/hora en SQL Server



obtener hora sql server (10)

Estoy intentando escribir un procedimiento almacenado que selecciona columnas de una tabla y agrega 2 columnas adicionales al ResultSet. Estas 2 columnas adicionales son el resultado de las conversiones en un campo de la tabla que es un campo de fecha y hora.

El campo de formato de fecha y hora tiene el siguiente formato ''AAAA-MM-DD HH: MM: SS.S''

Los 2 campos adicionales que deberían estar en el siguiente formato:

  1. DDMMM
  2. HHMMT, donde T es ''A'' para am y ''P'' para pm

Ejemplo: Si los datos en el campo fueron ''2008-10-12 13: 19: 12.0'', los campos extraídos deberían contener:

  1. 12OCT
  2. 0119P

He intentado usar formatos de cadena CONVERTIR, pero ninguno de los formatos coincide con el resultado que quiero obtener. Estoy pensando en la extracción de los datos de campo a través de CONVERT y luego en REEMPLAZAR, pero seguramente necesito ayuda aquí, ya que no estoy seguro.

¿Podría alguien versado en procedimientos almacenados ayudarme aquí? ¡Gracias!


El campo de formato de fecha y hora tiene el siguiente formato ''AAAA-MM-DD HH: MM: SS.S''

Esa declaración es falsa. Así es como Enterprise Manager o SQL Server elige mostrar la fecha. Internamente es un valor binario de 8 bytes, por lo que algunas de las funciones publicadas por Andrew funcionarán muy bien.

Kibbee también tiene un punto válido, y en un mundo perfecto estaría de acuerdo con él. Sin embargo, a veces desea vincular los resultados de la consulta directamente para mostrar el control o los widgets, y no existe la posibilidad de formatear. Y a veces la capa de presentación vive en un servidor web que está incluso más ocupado que la base de datos. Con eso en mente, no es necesariamente algo malo saber cómo hacer esto en SQL.


Necesitarás DATEPART aquí. Puede concatenar los resultados de las llamadas DATEPART juntas.

Para obtener las abreviaturas del mes, es posible que pueda usar DATENAME; si eso no funciona para usted, puede usar una declaración CASE en DATEPART.

DATEPART también trabaja para el campo de tiempo.

Puedo pensar en un par de maneras de obtener el indicador AM / PM, incluida la comparación de nuevas fechas creadas a través de DATEPART o el cálculo de los segundos totales transcurridos en el día y compararlos con los umbrales AM / PM conocidos.


No responde su pregunta específicamente, pero no es algo que debería ser manejado por la capa de presentación de su aplicación. Hacerlo de la manera que describe crea un procesamiento adicional en el final de la base de datos y agrega tráfico de red adicional (suponiendo que la base de datos exista en una máquina diferente a la aplicación), para algo que pueda calcularse fácilmente en el lado de la aplicación, con una fecha más rica procesando librerías, además de ser más independiente del idioma, especialmente en el caso de su primer ejemplo que contiene el nombre del mes abreviado. De todos modos, las respuestas que te dan los demás deben indicarte la dirección correcta si aún decides seguir esta ruta.


Si Depart es una solución para eso, pero creo que este tipo de métodos son viajes largos.

SERVIDOR SQL:

SELECT CAST(DATEPART(DD,GETDATE()) AS VARCHAR)+''/'' +CAST(DATEPART(MM,GETDATE()) AS VARCHAR) +''/''+CAST(DATEPART(YYYY,GETDATE()) AS VARCHAR) +'' ''+CAST(DATEPART(HH,GETDATE()) AS VARCHAR) +'':''+CAST(DATEPART(MI,GETDATE()) AS VARCHAR)

Oráculo:

Select to_char(sysdate,''DD/MM/YYYY HH24:MI'') from dual

Puede escribir su propia función de esta manera puede deshacerse de este lío;

http://sql.dzone.com/news/custom-date-formatting-sql-ser

select myshortfun(getdate(),myformat) GO


Si dt ​​es tu columna de fecha y hora, entonces

Para 1:

SUBSTRING(CONVERT(varchar, dt, 13), 1, 2) + UPPER(SUBSTRING(CONVERT(varchar, dt, 13), 4, 3))

Para 2:

SUBSTRING(CONVERT(varchar, dt, 100), 13, 2) + SUBSTRING(CONVERT(varchar, dt, 100), 16, 3)


en MS SQL Server puedes hacer:

SET DATEFORMAT ymd

año mes dia,


Si se trata de algo más específico como DateKey ( yyyymmdd ) que necesita para los modelos dimensionales, sugiero algo sin DateKey / DateKey :

DECLARE @DateKeyToday int = (SELECT 10000 * DATEPART(yy,GETDATE()) + 100 * DATEPART(mm,GETDATE()) + DATEPART(dd,GETDATE())); PRINT @DateKeyToday


Estoy agregando esta respuesta (para mí) como relevante para el formato personalizado.

Para subrayado yyyy_MM_dd

REPLACE(SUBSTRING(CONVERT(VARCHAR, @dt, 120), 1, 10),''-'',''_'')


Use DATENAME y ajuste la lógica en una función, no en un programa almacenado

declare @myTime as DateTime set @myTime = GETDATE() select @myTime select DATENAME(day, @myTime) + SUBSTRING(UPPER(DATENAME(month, @myTime)), 0,4)

Devuelve "14OCT"

Intente no usar ninguna operación basada en Caracteres / Cadenas si es posible cuando trabaje con fechas. Son numéricos (un flotante) y el rendimiento sufrirá esas conversiones de tipo de datos.

Busque estas prácticas conversiones que he compilado a lo largo de los años ...

/* Common date functions */ --//This contains common date functions for MSSQL server /*Getting Parts of a DateTime*/ --//gets the date only, 20x faster than using Convert/Cast to varchar --//this has been especially useful for JOINS SELECT (CAST(FLOOR(CAST(GETDATE() as FLOAT)) AS DateTime)) --//gets the time only (date portion is ''1900-01-01'' and is considered the "0 time" of dates in MSSQL, even with the datatype min value of 01/01/1753. SELECT (GETDATE() - (CAST(FLOOR(CAST(GETDATE() as FLOAT)) AS DateTime))) /*Relative Dates*/ --//These are all functions that will calculate a date relative to the current date and time /*Current Day*/ --//now SELECT (GETDATE()) --//midnight of today SELECT (DATEADD(ms,-4,(DATEADD(dd,DATEDIFF(dd,0,GETDATE()) + 1,0)))) --//Current Hour SELECT DATEADD(hh,DATEPART(hh,GETDATE()),CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DateTime)) --//Current Half-Hour - if its 9:36, this will show 9:30 SELECT DATEADD(mi,((DATEDIFF(mi,(CAST(FLOOR(CAST(GETDATE() as FLOAT)) as DateTime)), GETDATE())) / 30) * 30,(CAST(FLOOR(CAST(GETDATE() as FLOAT)) as DateTime))) /*Yearly*/ --//first datetime of the current year SELECT (DATEADD(yy,DATEDIFF(yy,0,GETDATE()),0)) --//last datetime of the current year SELECT (DATEADD(ms,-4,(DATEADD(yy,DATEDIFF(yy,0,GETDATE()) + 1,0)))) /*Monthly*/ --//first datetime of current month SELECT (DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)) --//last datetime of the current month SELECT (DATEADD(ms,-4,DATEADD(mm,1,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)))) --//first datetime of the previous month SELECT (DATEADD(mm,DATEDIFF(mm,0,GETDATE()) -1,0)) --//last datetime of the previous month SELECT (DATEADD(ms, -4,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0))) /*Weekly*/ --//previous monday at 12AM SELECT (DATEADD(wk,DATEDIFF(wk,0,GETDATE()) -1 ,0)) --//previous friday at 11:59:59 PM SELECT (DATEADD(ms,-4,DATEADD(dd,5,DATEADD(wk,DATEDIFF(wk,0,GETDATE()) -1 ,0)))) /*Quarterly*/ --//first datetime of current quarter SELECT (DATEADD(qq,DATEDIFF(qq,0,GETDATE()),0)) --//last datetime of current quarter SELECT (DATEADD(ms,-4,DATEADD(qq,DATEDIFF(qq,0,GETDATE()) + 1,0)))


Puede usar el siguiente comando en el servidor SQL para hacerlo:

select FORMAT(getdate(), N''yyyy-MM-ddThh:mm:ss'')