select dbo.fn_format(getdate(),'ddd, dd/mmm/yyyy')
select dbo.fn_format('123456.8','###,###.#0')
create function Fn_Format(@CampoFormat sql_variant, @Formato as varchar(20)=NULL)
RETURNS VARCHAR(8000)
---***************************************************************************************************************************************************************
-- Formatos Soportados
-- Fecha
--('d', 'dd', 'dddd', 'm', 'mm', 'mmm', 'mmmm' , 'yy', 'yyyy'
-- 'd mm', 'd-mm', 'd/mm', 'd.mm', 'dd mm', 'dd-mm', 'dd/mm', 'dd.mm', 'ddd mm', 'ddd-mm', 'ddd/mm', 'ddd.mm'
-- 'dddd mm', 'dddd-mm', 'dddd/mm', 'dddd.mm', 'dd mmm', 'dd-mmm', 'dd/mmm', 'dd.mmm', 'dd mmmm' 'dd-mmmm', 'dd/mmmm', 'dd.mmmm'
-- 'm yy', 'm-yy', 'm/yy', 'm.yy', 'mm yy', 'mm-yy', 'mm/yy', 'mm.yy',
-- 'mmm yy', 'mmm-yy', 'mmm/yy', 'mmm.yy', 'mmmm yy',
-- 'mmmm-yy', 'mmmm/yy', 'mmmm.yy', 'mmmm yy', 'mmmm-yy', 'mmmm/yy', 'mmmm.yy',
-- 'mmm yyyy', 'mmm-yyyy', 'mmm/yyyy', 'mmm.yyyy',
-- 'mmmm yyyy', 'mmmm-yyyy' 'mmmm/yyyy' 'mmmm.yyyy' ,
-- 'd m yy', 'd-m-yy', 'd/m/yy', 'd.m.yy', 'd mm yy', 'd-mm-yy',
-- 'd/mm/yy', 'd.mm.yy' , 'dd mm yy' ,'dd-mm-yy' ,'dd/mm/yy' ,'dd.mm.yy',
-- 'd m yyyy' ,'d-m-yyyy' ,'d/m/yyyy' ,'d.m.yyyy' , 'd mm yyyy' ,
-- 'd-mm-yyyy' ,'d/mm/yyyy' ,'d.mm.yyyy' , 'dd mm yyyy' ,'dd-mm-yyyy' ,
-- 'dd/mm/yyyy' ,'dd.mm.yyyy','ddd mmm y' ,'ddd-mmm-y' ,'dddd/mmm/y' ,'ddd.mmm.y' ,'ddd mmm yy' ,
-- 'ddd-mmm-yy' ,'ddd/mmm/yy' ,'ddd.mmm.yy' ,'ddd mmm yyyy', 'ddd-mmm-yyyy' ,
-- 'dddd/mmm/yyyy' ,'dddd.mmmm.yyyy' ,'dddd mmmm yyyy' ,'dddd-mmmm-yyyy' ,'dddd/mmmm/yyyy' ,'dddd.mmmm.yyyy'
-- Numeros
--("###,###.#0", "###,###")
--
-- Funcion Creada por Jimmy Poma e-mail jdak67@hotmail.com Fecha 18/agos/2004
-- Modificado Por Jimmy Fecha 19/Agosto/2004 ora 13:25 para que acepte El Formato Null y devuelva tal como lo envio
-- Modificado Por Jimmy Fecha 20/Agosto/2004 ora 13:25 para que acepte todos los Formatos Fecha o almenos casi todos :)
-- Todos los derechos reservados :) no, menrita jeje
-- SI LE REALIZAN ALGUN CAMBIO ME AVISAS PARA TENERLO ACTUALIZADO AL jdak67@hotmail.com
-- MODIFICADO POR JIMMY FECHA 19/ENE/2010 SE AGREGO EL FORMATO DDD, DD-MM-YY
---***************************************************************************************************************************************************************
as
begin
--Declaracion de Variables
Declare @Trim SQL_VARIANT
Declare @PosIni as int
Declare @CantPos as int
Declare @CantDecimales as int
Declare @TipoFecha as int
Declare @Devuelve as varchar(8000)
Declare @TipoFormato as int
Declare @Separador as char(1)
Declare @Dia as varchar(50)
Declare @Mes as varchar(50)
Declare @Anio as varchar(50)
DECLARE @Primero as bit
DECLARE @LOOP as bit
--VALIDA EL FORMATO SI ES NUMERICO, FECHA O CUALQUIER OTRO TIPO
IF @Formato IS NULL
BEGIN
SET @Devuelve = CONVERT(VARCHAR(8000), @CampoFormat)
GOTO Salir
END
If PATINDEX('%#%',@Formato)<=0
BEGIN
If @Formato = 'd' or @Formato = 'dd'
Begin
--Va a mostrar dia
SET @TipoFormato = 1
SET @TipoFecha = 103
End
If @Formato = 'ddd'
Begin
--Va a mostrar Lun
SET @TipoFormato = 2
SET @TipoFecha = 103
End
If @Formato = 'dddd'
Begin
--Va a mostrar Lunes
SET @TipoFormato = 3
SET @TipoFecha = 103
End
If @Formato = 'm' or @Formato = 'mm'
Begin
--Va a mostrar 01
SET @TipoFormato = 4
SET @TipoFecha = 101
End
If @Formato = 'mmm'
Begin
--Va a mostrar Ene
SET @TipoFormato = 5
SET @TipoFecha = 103
End
If @Formato = 'mmmm'
Begin
--Va a mostrar Enero
SET @TipoFormato = 6
SET @TipoFecha = 103
End
If @Formato = 'y' or @Formato = 'yy'
Begin
--Va a mostrar 79
SET @TipoFormato = 7
SET @TipoFecha = 2
End
If @Formato = 'yyy' or @Formato = 'yyyy'
Begin
--Va a mostrar 1979
SET @TipoFormato = 8
SET @TipoFecha = 102
End
--PARA LOS DIAS
If @Formato = 'd mm' or @Formato = 'd-mm' or @Formato = 'd/mm' or @Formato = 'd.mm' or
@Formato = 'dd mm' or @Formato = 'dd-mm' or @Formato = 'dd/mm' or @Formato = 'dd.mm'
Begin
--Va a mostrar 01-01
SET @TipoFormato = 9
SET @TipoFecha = 103
End
If @Formato = 'ddd mm' or @Formato = 'ddd-mm' or @Formato = 'ddd/mm' or @Formato = 'ddd.mm'
Begin
--Va a mostrar en dias Jue 02
SET @TipoFormato = 10
SET @TipoFecha = 103
End
If @Formato = 'dddd mm' or @Formato = 'dddd-mm' or @Formato = 'dddd/mm' or @Formato = 'dddd.mm'
Begin
--Va a mostrar en dias Jueves 02
SET @TipoFormato = 11
SET @TipoFecha = 103
End
--PARA LOS MESES
If @Formato = 'dd mmm' or @Formato = 'dd-mmm' or @Formato = 'dd/mmm' or @Formato = 'dd.mmm'
Begin
--Va a mostrar en dias 01 Dic
SET @TipoFormato = 12
SET @TipoFecha = 103
End
If @Formato = 'dd mmmm' or @Formato = 'dd-mmmm' or @Formato = 'dd/mmmm' or @Formato = 'dd.mmmm'
Begin
--Va a mostrar en dias 01 Diciembre
SET @TipoFormato = 13
SET @TipoFecha = 103
End
If @Formato = 'm yy' or @Formato = 'm-yy' or @Formato = 'm/yy' or @Formato = 'm.yy' or
@Formato = 'mm yy' or @Formato = 'mm-yy' or @Formato = 'mm/yy' or @Formato = 'mm.yy'
Begin
--Va a mostrar en dias 01 79
SET @TipoFormato =14
SET @TipoFecha = 3
End
If @Formato = 'mmm yy' or @Formato = 'mmm-yy' or @Formato = 'mmm/yy' or @Formato = 'mmm.yy'
Begin
--Va a mostrar en Dic 02
SET @TipoFormato =15
SET @TipoFecha = 3
End
If @Formato = 'mmmm yy' or @Formato = 'mmmm-yy' or @Formato = 'mmmm/yy' or @Formato = 'mmmm.yy'
Begin
--Va a mostrar en Diciembre 02
SET @TipoFormato =16
SET @TipoFecha = 3
End
If @Formato = 'mmm yyyy' or @Formato = 'mmm-yyyy' or @Formato = 'mmm/yyyy' or @Formato = 'mmm.yyyy'
Begin
--Va a mostrar en Dic 2002
SET @TipoFormato = 17
SET @TipoFecha = 103
End
If @Formato = 'mmmm yyyy' or @Formato = 'mmmm-yyyy' or @Formato = 'mmmm/yyyy' or @Formato = 'mmmm.yyyy'
Begin
--Va a mostrar en Diciembre 2002
SET @TipoFormato = 18
SET @TipoFecha = 103
End
If @Formato = 'd m yy' or @Formato = 'd-m-yy' or @Formato = 'd/m/yy' or @Formato = 'd.m.yy' or
@Formato = 'd mm yy' or @Formato = 'd-mm-yy' or @Formato = 'd/mm/yy' or @Formato = 'd.mm.yy' or
@Formato = 'dd mm yy' or @Formato = 'dd-mm-yy' or @Formato = 'dd/mm/yy' or @Formato = 'dd.mm.yy'
Begin
--Va a mostrar en 01 02 79
SET @TipoFormato = 19
SET @TipoFecha = 3 --es el punto
End
If @Formato = 'd m yyyy' or @Formato = 'd-m-yyyy' or @Formato = 'd/m/yyyy' or @Formato = 'd.m.yyyy' or
@Formato = 'd mm yyyy' or @Formato = 'd-mm-yyyy' or @Formato = 'd/mm/yyyy' or @Formato = 'd.mm.yyyy' or
@Formato = 'dd mm yyyy' or @Formato = 'dd-mm-yyyy' or @Formato = 'dd/mm/yyyy' or @Formato = 'dd.mm.yyyy'
Begin
--Va a mostrar en 01 02 1979
SET @TipoFormato = 20
SET @TipoFecha = 103 --es el punto
End
If @Formato = 'ddd mmm y' or @Formato = 'ddd-mmm-y' or @Formato = 'dddd/mmm/y' or @Formato = 'ddd.mmm.y' or
@Formato = 'ddd mmm yy' or @Formato = 'ddd-mmm-yy' or @Formato = 'ddd/mmm/yy' or @Formato = 'ddd.mmm.yy'
Begin
--Va a mostrar en lun Dic 79
SET @TipoFormato = 21
SET @TipoFecha = 3 --es el punto
End
If @Formato = 'ddd mmm yyyy' or @Formato = 'ddd-mmm-yyyy' or @Formato = 'dddd/mmm/yyyy' or @Formato = 'dddd.mmmm.yyyy'
Begin
--Va a mostrar en lun Dic 1979
SET @TipoFormato = 22
SET @TipoFecha = 103 --es el punto
End
If @Formato = 'dddd mmmm yyyy' or @Formato = 'dddd-mmmm-yyyy' or @Formato = 'dddd/mmmm/yyyy' or @Formato = 'dddd.mmmm.yyyy'
Begin
--Va a mostrar en lunes Diciembre 1979
SET @TipoFormato = 23
SET @TipoFecha = 103 --es el punto
End
If @Formato = 'ddd, dd mm yy' or @Formato = 'ddd, dd-mm-yy' or @Formato = 'ddd, dd/mm/yy' or @Formato = 'ddd, dd.mm.yy'
Begin
--Va a mostrar en lun, 17 12 79
SET @TipoFormato = 24
SET @TipoFecha = 103 --es el punto
End
If @Formato = 'ddd, dd mmm yyyy' or @Formato = 'ddd, dd-mmm-yyyy' or @Formato = 'ddd, dd/mmm/yyyy' or @Formato = 'ddd, dd.mmm.yyyy'
Begin
--Va a mostrar en lun, 17 Dic 1979
SET @TipoFormato = 25
SET @TipoFecha = 103 --es el punto
End
--ESTA PARTE FALTA
If @Formato = 'dddd mmmm yyyy' or @Formato = 'dddd-mmmm-yyyy' or @Formato = 'dddd/mmmm/yyyy' or @Formato = 'dddd.mmmm.yyyy'
Begin
--Va a mostrar en lunes Diciembre 1979
SET @TipoFormato = 26
SET @TipoFecha = 103 --es el punto
End
If @Formato = 'ddd, DD MM YY' or @Formato = 'ddd, DD-MM-YY' or @Formato = 'ddd, DD/MM/YY' or @Formato = 'ddd, DD.MM.YY'
Begin
--Va a mostrar en lun, 17 12 79
SET @TipoFormato = 27
SET @TipoFecha = 103 --es el punto
End
set @Devuelve = CASE @TipoFormato
WHEN 1 THEN SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),1,2)
WHEN 2 THEN SUBSTRING(DATENAME(dw,CONVERT(VARCHAR(20),@CampoFormat)),1,3)
WHEN 3 THEN DATENAME(dw,CONVERT(VARCHAR(20),@CampoFormat))
WHEN 4 THEN SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),1,2)
WHEN 5 THEN SUBSTRING(DATENAME(mm,CONVERT(VARCHAR(20),@CampoFormat)),1,3)
WHEN 6 THEN DATENAME(mm,CONVERT(VARCHAR(20),@CampoFormat))
WHEN 7 THEN SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),1,2)
WHEN 8 THEN SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),1,4)
WHEN 9 THEN SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),1,2) + SUBSTRING(@Formato,PATINDEX('%m%',@Formato)-1,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),4,2)
WHEN 10 THEN SUBSTRING(DATENAME(dw,CONVERT(VARCHAR(20),@CampoFormat)),1,3) + SUBSTRING(@Formato,4,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),4,2)
WHEN 11 THEN DATENAME(dw,CONVERT(VARCHAR(20),@CampoFormat)) + SUBSTRING(@Formato,5,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),4,2)
WHEN 12 THEN SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),1,2) + SUBSTRING(@Formato,3,1) + SUBSTRING(DATENAME(mm,CONVERT(VARCHAR(20),@CampoFormat)),1,3)
WHEN 13 THEN SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),1,2) + SUBSTRING(@Formato,3,1) + DATENAME(mm,CONVERT(VARCHAR(20),@CampoFormat))
WHEN 14 THEN SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),4,2) + SUBSTRING(@Formato,PATINDEX('%y%',@Formato)-1,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),7,2)
WHEN 15 THEN SUBSTRING(DATENAME(mm,CONVERT(VARCHAR(20),@CampoFormat)),1,3) + SUBSTRING(@Formato,4,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),7,2)
WHEN 16 THEN DATENAME(mm,CONVERT(VARCHAR(20),@CampoFormat)) + SUBSTRING(@Formato,5,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),7,2)
WHEN 17 THEN SUBSTRING(DATENAME(mm,CONVERT(VARCHAR(20),@CampoFormat)),1,3) + SUBSTRING(@Formato,4,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),7,4)
WHEN 18 THEN DATENAME(mm,CONVERT(VARCHAR(20),@CampoFormat)) + SUBSTRING(@Formato,5,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),7,4)
WHEN 19 THEN SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),1,2) + SUBSTRING(@Formato,PATINDEX('%m%',@Formato)-1,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),4,2) + SUBSTRING(@Formato,PATINDEX('%m%',@Formato)-1,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),7,2)
WHEN 20 THEN SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),1,2) + SUBSTRING(@Formato,PATINDEX('%m%',@Formato)-1,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),4,2) + SUBSTRING(@Formato,PATINDEX('%m%',@Formato)-1,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),7,4)
WHEN 21 THEN SUBSTRING(DATENAME(dw,CONVERT(VARCHAR(20),@CampoFormat)),1,3) + SUBSTRING(@Formato,PATINDEX('%m%',@Formato)-1,1) + SUBSTRING(DATENAME(mm,CONVERT(VARCHAR(20),@CampoFormat)),1,3) + SUBSTRING(@Formato,PATINDEX('%m%',@Formato)-1,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),7,2)
WHEN 22 THEN SUBSTRING(DATENAME(dw,CONVERT(VARCHAR(20),@CampoFormat)),1,3) + SUBSTRING(@Formato,PATINDEX('%m%',@Formato)-1,1) + SUBSTRING(DATENAME(mm,CONVERT(VARCHAR(20),@CampoFormat)),1,3) + SUBSTRING(@Formato,PATINDEX('%m%',@Formato)-1,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),7,4)
WHEN 23 THEN DATENAME(dw,CONVERT(VARCHAR(20),@CampoFormat)) + SUBSTRING(@Formato,PATINDEX('%m%',@Formato)-1,1) + DATENAME(mm,CONVERT(VARCHAR(20),@CampoFormat)) + SUBSTRING(@Formato,PATINDEX('%m%',@Formato)-1,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),7,4)
WHEN 24 THEN SUBSTRING(DATENAME(dw,CONVERT(VARCHAR(20),@CampoFormat)),1,3) + ', ' + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),1,2) + SUBSTRING(@Formato,PATINDEX('%m%',@Formato)-1,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),4,2) + SUBSTRING(@Formato,PATINDEX('%m%',@Formato)-1,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),9,2)
WHEN 25 THEN SUBSTRING(DATENAME(dw,CONVERT(VARCHAR(20),@CampoFormat)),1,3) + ', ' + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),1,2) + SUBSTRING(@Formato,PATINDEX('%m%',@Formato)-1,1) + SUBSTRING(DATENAME(mm,CONVERT(VARCHAR(20),@CampoFormat)),1,3) + SUBSTRING(@Formato,PATINDEX('%m%',@Formato)-1,1) + SUBSTRING(CONVERT(VARCHAR(10),@CampoFormat,@TipoFecha),7,4)
ELSE CONVERT(VARCHAR(50),@CampoFormat)
END
GOTO SALIR
END
ELSE
BEGIN
If @Formato = '###,###.#0'
Begin
SET @CantDecimales = 2
SET @CantPos= 15
SET @TipoFecha = 101
Set @Devuelve = CONVERT( DECIMAL(26,2), @CampoFormat )
End
If @Formato = '###,###'
Begin
SET @CantDecimales = 0
SET @PosIni = 1
SET @CantPos= 15
SET @TipoFecha = 101
Set @Devuelve = CONVERT( DECIMAL(26,0), @CampoFormat )
End
set @Primero = 1
SET @LOOP = 1
WHILE @LOOP=1
BEGIN
If @Primero = 1
BEGIN
SET @Primero = 0
If len(@Devuelve) > 6
BEGIN
if CHARINDEX('.',@Devuelve)> 0
BEGIN
SET @Devuelve = STUFF(@Devuelve,CHARINDEX('.',@Devuelve)-3, 0, ',')
END
ELSE
BEGIN
SET @Devuelve = STUFF(@Devuelve,LEN(@Devuelve)-2, 0, ',')
END
END
ELSE
BEGIN
SET @LOOP = 0
BREAK
END
END
ELSE
BEGIN
IF CHARINDEX(',',@Devuelve) <= 4
BEGIN
SET @LOOP = 0
BREAK
END
ELSE
BEGIN
SET @Devuelve = STUFF(@Devuelve,CHARINDEX(',',@Devuelve)-3, 0, ',')
END --IF
END --IF
END --WHILE
END
Salir:
Return(@Devuelve)
end
Comentarios sobre la versión: Versión 1 (5)
PRINT Fn_Format (\'1/1/2000\',\'mm/dd/aaaa\') ?????? toy confundido :S
Seria bueno poner un ejemplito....bye
Aqui esta:
select dbo.Fn_Format(getdate(),'dd/mm/yyyy')
select dbo.Fn_Format(1236487.478,'###,###.#0')
en la parte inicial esta comentado los tipos de formato que soporta.