PowerShell Advanced — Topic #5

Normalize Date Formats

Normalizar formatos de fechas

Convert mixed date values into the ISO standard YYYY-MM-DD, making the data easier to load into SQL databases, validate, sort, filter, and analyze.

Convertir fechas mezcladas al estándar ISO YYYY-MM-DD, haciendo la data más fácil de cargar en SQL, validar, ordenar, filtrar y analizar.

FocusEnfoque
SQL preparationPreparación para SQL
ToolHerramienta
PowerShell + Date Parsing
OutputResultado
ISO formatted datesFechas en formato ISO

Cybersecurity & Production Environment Warning

Advertencia de ciberseguridad y ambiente de producción

This exercise is for learning and testing purposes only. Do not run scripts against production data, network shares, official HR files, student records, patient records, enterprise repositories, or business-critical folders without proper authorization, backups, testing, least-privilege permissions, change-control approval, and compliance with your organization’s cybersecurity policies.

Este ejercicio es solo para aprendizaje y pruebas. No ejecutes scripts contra datos de producción, carpetas compartidas, archivos oficiales de recursos humanos, expedientes de estudiantes, expedientes de pacientes, repositorios empresariales o carpetas críticas sin autorización, respaldos, pruebas, permisos mínimos, aprobación de control de cambios y cumplimiento de las políticas de ciberseguridad de tu organización.

Business Scenario

Escenario de negocio

A CSV file contains dates entered in different formats by different users, systems, or exports. Before loading this data into SQL Server or using it in reporting, the dates must be converted into one consistent ISO format.

Un archivo CSV contiene fechas ingresadas en diferentes formatos por distintos usuarios, sistemas o exportaciones. Antes de cargar esta data en SQL Server o usarla en reportes, las fechas deben convertirse a un formato ISO consistente.

01/15/2026 → 2026-01-1515/01/2026 → 2026-01-152026.01.15 → 2026-01-15Bad dates → Review

Learning Objectives

Objetivos de aprendizaje

Sample Input Data

Data de entrada de ejemplo

EmployeeID,Name,HireDate
1001,Juan Carballo,01/15/2026
1002,Maria Lopez,15/01/2026
1003,Pedro Martinez,2026-01-15
1004,Ana Torres,2026.01.15
1005,Luis Perez,invalid-date

Step 1 — Define Source and Output Files

Paso 1 — Definir archivos de entrada y salida

$sourceFile = "C:\Training\dates_raw.csv"
$outputFile = "C:\Training\dates_clean.csv"

Step 2 — Import the CSV File

Paso 2 — Importar el archivo CSV

$records = Import-Csv -Path $sourceFile

Step 3 — Define Accepted Date Formats

Paso 3 — Definir formatos de fecha aceptados

$dateFormats = @(
    "MM/dd/yyyy",
    "dd/MM/yyyy",
    "yyyy-MM-dd",
    "yyyy.MM.dd"
)

Step 4 — Normalize the Date Column

Paso 4 — Normalizar la columna de fecha

$records | ForEach-Object {
    $parsedDate = $null

    if ([datetime]::TryParseExact(
        $_.HireDate,
        $dateFormats,
        $null,
        [System.Globalization.DateTimeStyles]::None,
        [ref]$parsedDate
    )) {
        $_ | Add-Member -NotePropertyName "HireDate_ISO" -NotePropertyValue $parsedDate.ToString("yyyy-MM-dd") -Force
        $_ | Add-Member -NotePropertyName "Date_Status" -NotePropertyValue "Valid" -Force
    }
    else {
        $_ | Add-Member -NotePropertyName "HireDate_ISO" -NotePropertyValue "" -Force
        $_ | Add-Member -NotePropertyName "Date_Status" -NotePropertyValue "Review" -Force
    }
}

Step 5 — Export the Clean File

Paso 5 — Exportar el archivo limpio

$records | Export-Csv -Path $outputFile -NoTypeInformation -Encoding UTF8

Complete Script

Script completo

$sourceFile = "C:\Training\dates_raw.csv"
$outputFile = "C:\Training\dates_clean.csv"

$dateFormats = @(
    "MM/dd/yyyy",
    "dd/MM/yyyy",
    "yyyy-MM-dd",
    "yyyy.MM.dd"
)

$records = Import-Csv -Path $sourceFile

$records | ForEach-Object {
    $parsedDate = $null

    if ([datetime]::TryParseExact(
        $_.HireDate,
        $dateFormats,
        $null,
        [System.Globalization.DateTimeStyles]::None,
        [ref]$parsedDate
    )) {
        $_ | Add-Member -NotePropertyName "HireDate_ISO" -NotePropertyValue $parsedDate.ToString("yyyy-MM-dd") -Force
        $_ | Add-Member -NotePropertyName "Date_Status" -NotePropertyValue "Valid" -Force
    }
    else {
        $_ | Add-Member -NotePropertyName "HireDate_ISO" -NotePropertyValue "" -Force
        $_ | Add-Member -NotePropertyName "Date_Status" -NotePropertyValue "Review" -Force
    }
}

$records | Export-Csv -Path $outputFile -NoTypeInformation -Encoding UTF8

Expected Result

Resultado esperado

Before

Antes

NameHireDate
Juan Carballo01/15/2026
Maria Lopez15/01/2026
Pedro Martinez2026-01-15
Ana Torres2026.01.15
Luis Perezinvalid-date

After

Después

NameHireDate_ISOStatus
Juan Carballo2026-01-15Valid
Maria Lopez2026-01-15Valid
Pedro Martinez2026-01-15Valid
Ana Torres2026-01-15Valid
Luis PerezReview

Validation Checklist

Lista de validación

Professional Notes

Notas profesionales

Date normalization is essential before database imports, ETL processes, dashboard development, and audit reporting. When dates come from multiple sources, never assume one format. Validate explicitly and keep rejected values visible for review.

La normalización de fechas es esencial antes de importaciones a bases de datos, procesos ETL, dashboards y reportes de auditoría. Cuando las fechas vienen de múltiples fuentes, nunca asumas un solo formato. Valida explícitamente y conserva los valores rechazados para revisión.