Pregunta

Estoy tratando de 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 en la tabla que es un campo de fecha y hora.

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

Los 2 campos adicionales que deben estar en el siguiente formato:

  1. DDMMM
  2. HHMMT, donde T es 'A' para a.m. y 'P' para p.m.

Ejemplo: si los datos en el campo eran '2008-10-12 13: 19: 12.0', los campos extraídos deben contener:

  1. 12OCT
  2. 0119P

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

¿Podría alguien que esté bien versado en procedimientos almacenados ayudarme aquí? Gracias!

¿Fue útil?

Solución

Si dt ??es su 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)

Otros consejos

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

declare @myTime as DateTime

set @myTime = GETDATE()

select @myTime

select DATENAME(day, @myTime) + SUBSTRING(UPPER(DATENAME(month, @myTime)), 0,4)

Devuelve " 14OCT "

Trate de no usar ninguna operación basada en caracteres / cadenas si es posible al trabajar con fechas. Son numéricos (un flotador) y el rendimiento sufrirá esas conversiones de tipo de datos.

Exprima estas conversiones prácticas 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)))

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

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

No respondo a tu pregunta específicamente, pero no es eso algo que debe ser manejado por la capa de presentación de tu aplicación. Hacerlo de la manera que describe crea un procesamiento adicional en el extremo de la base de datos, así como agregar tráfico de red adicional (suponiendo que la base de datos exista en una máquina diferente a la aplicación), para algo que podría calcularse fácilmente en el lado de la aplicación, con una fecha más rica. el procesamiento de bibliotecas, además de ser más independiente del lenguaje, especialmente en el caso del primer ejemplo que contiene el nombre abreviado del mes. De todos modos, las respuestas que otros le den deberían apuntarle en la dirección correcta si aún decide ir por esta ruta.

  

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

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

Kibbee también hace 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 realmente no hay posibilidad de hacer ningún formato. Y a veces la capa de presentación vive en un servidor web que está incluso más ocupado que la base de datos. Teniendo esto en cuenta, no es necesariamente algo malo saber cómo hacer esto en SQL.

Sí, 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)

Oracle:

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

Puedes escribir tu propia función de esta manera para deshacerte de este lío;

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

select myshortfun(getdate(),myformat)
GO

Vas a necesitar DATEPART aquí. Puede concatenar los resultados de las llamadas DATEPART juntas.

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

DATEPART también funciona para el campo de hora.

Se me ocurren varias formas de obtener el indicador de AM / PM, incluida la comparación de nuevas fechas creadas a través de DATEPART o el cálculo del total de segundos transcurridos en el día y la comparación con los umbrales de AM / PM conocidos.

en MS SQL Server puedes hacerlo:

SET DATEFORMAT ymd

año, mes, día,

Si es algo más específico como DateKey ( yyyymmdd ) que necesita para los modelos dimensionales, sugiero algo sin ningún tipo de conversión / conversión:

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 el subrayado yyyy_MM_dd

REPLACE(SUBSTRING(CONVERT(VARCHAR, @dt, 120), 1, 10),'-','_')
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top