Cómo convertir fechas julianas de JDE en SQL Server (y viceversa)
Convierte fechas entre SQL Server y el formato CYYDDD de JD Edwards con T-SQL, validaciones de rango y ejemplos de años bisiestos.
7 de septiembre de 2026 · LBE · 7 min de lecturaCuando trabajamos con integraciones, consultas o migraciones de JD Edwards EnterpriseOne, es común encontrar fechas almacenadas como números o cadenas de seis posiciones. Un valor como 126250 representa el 7 de septiembre de 2026 en el formato de fecha que JDE suele llamar juliano.
En este artículo convertiremos una fecha de SQL Server al formato JDE y haremos la operación inversa. Las funciones devuelven NULL cuando el valor no puede representar una fecha válida, en lugar de convertirlo silenciosamente.
¿Solo necesitas convertir una fecha rápidamente? Utiliza el convertidor de fecha juliana de LBE.
No es el día juliano astronómico
Aunque se le llama “fecha juliana”, JDE utiliza el formato ordinal CYYDDD:
C: siglo contado desde 1900. El siglo XX se representa con0y el XXI con1.YY: los dos últimos dígitos del año.DDD: día del año, desde001hasta365o366.
Oracle documenta este formato como cyyddd y muestra, por ejemplo, 099152 para el 1 de junio de 1999 y 100153 para el 1 de junio de 2000. El cero inicial forma parte de la representación de seis posiciones, aunque una columna numérica puede mostrar 99152 al omitirlo. No debe confundirse con el número de día juliano usado en astronomía.
| Fecha | C | YY | DDD | Representación CYYDDD |
|---|---|---|---|---|
| 1 de enero de 1900 | 0 | 00 | 001 | 000001 |
| 1 de junio de 1999 | 0 | 99 | 152 | 099152 |
| 1 de junio de 2000 | 1 | 00 | 153 | 100153 |
| 7 de septiembre de 2026 | 1 | 26 | 250 | 126250 |
El 2000 fue bisiesto; por eso el 1 de junio de ese año corresponde al día 153 y no al 152.
Convertir una fecha de SQL Server a CYYDDD
La conversión tiene tres partes:
- Calcular
Ccomo(año - 1900) / 100. - Obtener
YYconaño % 100. - Obtener
DDDconDATEPART(dayofyear, fecha).
En T-SQL, ambas expresiones son enteras porque YEAR y DATEPART devuelven int; por ello / descarta la parte fraccionaria. El formato final se construye como texto para conservar ceros iniciales.
DECLARE @Fecha date = '2026-09-07';
DECLARE @Anio int = YEAR(@Fecha);
SELECT CONCAT(
(@Anio - 1900) / 100,
RIGHT(CONCAT('00', @Anio % 100), 2),
RIGHT(CONCAT('000', DATEPART(dayofyear, @Fecha)), 3)
) AS FechaJulianaJDE;
Resultado:
126250
Para reutilizarla, esta función limita el rango al que cabe en un solo dígito C: de 1900 a 2899. El rango es una decisión de representación; el origen de datos puede imponer un rango más pequeño.
CREATE OR ALTER FUNCTION dbo.FechaAJulianaJDE
(
@Fecha date
)
RETURNS char(6)
AS
BEGIN
IF @Fecha IS NULL
RETURN NULL;
DECLARE @Anio int = YEAR(@Fecha);
IF @Anio NOT BETWEEN 1900 AND 2899
RETURN NULL;
RETURN CONVERT(char(6), CONCAT(
(@Anio - 1900) / 100,
RIGHT(CONCAT('00', @Anio % 100), 2),
RIGHT(CONCAT('000', DATEPART(dayofyear, @Fecha)), 3)
));
END;
GO
Uso:
SELECT dbo.FechaAJulianaJDE('2024-02-29') AS FechaJulianaJDE;
Resultado: 124060. Si un sistema receptor exige un número, puede convertir el resultado a int, pero perderá el cero inicial en las fechas del siglo XX. Para intercambio o presentación, char(6) es más seguro.
Convertir CYYDDD a una fecha de SQL Server
Para invertir la operación separamos el valor:
C = valor / 100000.YY = (valor / 1000) % 100.DDD = valor % 1000.año = 1900 + (C * 100) + YY.
Estas divisiones son enteras. Por ejemplo, 126250 / 100000 produce 1, no 1.2625. Después construimos el 1 de enero y sumamos DDD - 1 días; el primer día del año requiere sumar cero.
DECLARE @Juliana int = 126250;
DECLARE @C int = @Juliana / 100000;
DECLARE @YY int = (@Juliana / 1000) % 100;
DECLARE @DDD int = @Juliana % 1000;
DECLARE @Anio int = 1900 + (@C * 100) + @YY;
SELECT DATEADD(day, @DDD - 1, DATEFROMPARTS(@Anio, 1, 1)) AS Fecha;
Resultado:
2026-09-07
Función inversa con validación
La función acepta texto para que pueda recibir tanto 099152 como 99152, que es lo que normalmente llega desde una columna numérica sin el cero inicial. Se recortan espacios externos, se rechazan caracteres no numéricos y se comprueba que DDD esté entre 1 y 366. TRY_CONVERT evita que un texto que no cabe en int provoque una excepción.
CREATE OR ALTER FUNCTION dbo.JulianaJDEAFecha
(
@Juliana varchar(20)
)
RETURNS date
AS
BEGIN
DECLARE @Texto varchar(20) = NULLIF(LTRIM(RTRIM(@Juliana)), '');
IF @Texto IS NULL
RETURN NULL;
IF LEN(@Texto) > 6 OR @Texto LIKE '%[^0-9]%'
RETURN NULL;
DECLARE @Valor int = TRY_CONVERT(int, @Texto);
IF @Valor IS NULL OR @Valor NOT BETWEEN 1 AND 999999
RETURN NULL;
DECLARE @C int = @Valor / 100000;
DECLARE @YY int = (@Valor / 1000) % 100;
DECLARE @DDD int = @Valor % 1000;
DECLARE @Anio int = 1900 + (@C * 100) + @YY;
IF @DDD NOT BETWEEN 1 AND 366
RETURN NULL;
DECLARE @Fecha date = DATEADD(
day,
@DDD - 1,
DATEFROMPARTS(@Anio, 1, 1)
);
-- Evita aceptar DDD = 366 en un año que no es bisiesto.
IF YEAR(@Fecha) <> @Anio
RETURN NULL;
RETURN @Fecha;
END;
GO
Ejemplos:
SELECT dbo.JulianaJDEAFecha('124060') AS BisiestoValido; -- 2024-02-29
SELECT dbo.JulianaJDEAFecha('125366') AS DiaInvalido; -- NULL
SELECT dbo.JulianaJDEAFecha('099152') AS CeroInicial; -- 1999-06-01
SELECT dbo.JulianaJDEAFecha(NULL) AS Nulo; -- NULL
0, 000000 y una cadena vacía devuelven NULL. Oracle muestra 0 como representación de fecha vacía en determinados archivos de interfaz, pero esa convención debe confirmarse para cada integración. Si el proceso confirma que 0 significa “sin fecha”, conviene mapearlo explícitamente a NULL antes de aplicar reglas de negocio.
Convertir una columna de una tabla
Si una tabla externa contiene una columna FechaJuliana, podemos usar la función así:
SELECT
T.FechaJuliana,
dbo.JulianaJDEAFecha(CONVERT(varchar(20), T.FechaJuliana)) AS FechaGregoriana
FROM dbo.TablaExterna AS T;
TablaExterna y FechaJuliana son nombres ilustrativos. No representan una tabla, alias ni columna estándar de JDE. Confirma el origen, tipo y convención de la integración antes de sustituirlos por objetos productivos.
Una función escalar es cómoda para reutilizar la lógica, pero puede ser costosa en grandes volúmenes porque se invoca por fila. Mide el plan y el tiempo real. Para millones de registros, considera expresar la conversión con CROSS APPLY, usar una función con valores de tabla en línea, normalizar la fecha durante la ingesta o usar una columna calculada persistida si encaja con el modelo. SQL Server 2019 y posteriores pueden aplicar scalar UDF inlining en funciones elegibles, pero no debe darse por hecho: comprueba el plan y la configuración de compatibilidad.
Casos que debemos validar
Antes de utilizar la conversión en producción, prueba al menos:
1900-01-01(000001) y2899-12-31(999365).- Primer y último día de un año común.
2024-02-29(124060).DDD = 366en 2024 y en 2025.NULL, cero,000000, negativos y cadenas vacías.- Texto con espacios, letras, signos o más de seis dígitos.
- Fechas anteriores a 1900 o posteriores a 2899.
- La convención específica del sistema que origina el dato.
La prueba debe distinguir entre un valor numérico y su representación textual: 099152 y 99152 pueden producir la misma fecha al leerlos, pero solo la primera conserva las seis posiciones.
Convertir sin ejecutar SQL
Para comprobar rápidamente ejemplos o comparar resultados, abre el convertidor de fecha juliana JDE. Permite convertir una fecha convencional a CYYDDD y realizar la operación inversa desde el navegador.
La herramienta es útil para validaciones puntuales; en procesos masivos o integraciones, utiliza código probado, registra los valores rechazados y evita corregir silenciosamente fechas inválidas.
Conclusión
El formato CYYDDD es compacto, pero resulta sencillo de interpretar cuando se separan siglo, año y día ordinal. SQL Server proporciona las piezas necesarias mediante YEAR, DATEPART, DATEFROMPARTS y DATEADD.
La parte importante no es solo obtener una fecha: también hay que conservar los ceros iniciales cuando se intercambia texto, validar DDD, considerar años bisiestos y documentar cómo se representan los valores vacíos en cada integración.
Fuentes
- Oracle JD Edwards EnterpriseOne: campos requeridos y formato juliano CYYDDD
- Oracle JD Edwards EnterpriseOne: fechas en interfaces EDI
- Microsoft Learn: funciones de fecha y hora de SQL Server
- Microsoft Learn: DATEPART (Transact-SQL)
- Microsoft Learn: DATEFROMPARTS (Transact-SQL)
- Microsoft Learn: DATEADD (Transact-SQL)
- Microsoft Learn: CREATE FUNCTION (Transact-SQL)
- Microsoft Learn: Scalar UDF inlining
Comentarios