1. Faro

Nivel 6 · El Black Friday en la zona horaria de la plataforma de anuncios

La solicitud

De Jordan Reyes, Director de Marketing

“La plataforma de anuncios reporta el fin de semana del Black Friday por día UTC, y nuestros pedidos por día nunca coinciden con sus conversiones. El Black Friday muestra 56 pedidos de nuestro lado. ¿Puedes reconstruir nuestro lado en días UTC para comparar peras con peras?”

Tu objetivo

order_date se guarda en hora local de la tienda (US Eastern, sin zona horaria asociada); a finales de noviembre de 2025 la hora del Este es UTC-5, así que UTC = order_date + 5 horas. Arregla la consulta: para los pedidos (todos los estados) cuya hora UTC cae desde 2025-11-28 00:00 hasta 2025-12-02 00:00 (sin incluirlo), devuelve una fila por día UTC con: utc_day (un DATE), orders y completed_orders (pedidos con estado 'completed'). Ordena por utc_day ascendente.

  • Lee de la tabla orderspendiente
  • Muestra exactamente utc_day orders completed_orderspendiente
  • 4 filas, ordenadas como se pidependiente

Tu consulta

SQL

Cargando el editor…

    ResultadoVista previa de orders · presiona Ejecutar para ver el tuyo
    Vista previa de orders
    order_idcustomer_idorder_datestatuschannel
    10011252023-01-01 20:51:19completedweb
    10021562023-01-02 07:58:46completedweb
    1003222023-01-02 10:25:27completedmarketplace
    1004482023-01-02 11:21:51completedmarketplace

    Mote revisa tu resultado

    Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

    Tablas

    Datos de la tienda Harbor & Pine, listos para consultar.

    orders12,000 filas · 7 columnas
    • order_idinteger
    • customer_idinteger
    • order_datetimestamp
    • statusvarchar
    • channelvarchar
    • shipping_feedecimal
    • coupon_codevarchar
    Primeras 5 filas de orders
    order_idcustomer_idorder_datestatuschannelshipping_feecoupon_code
    10011252023-01-01 20:51:19completedweb0.00NULL
    10021562023-01-02 07:58:46completedweb0.00NULL
    1003222023-01-02 10:25:27completedmarketplace4.99WELCOME10
    1004482023-01-02 11:21:51completedmarketplace4.99WELCOME10
    1005822023-01-02 11:43:36completedweb0.00WELCOME10
    customers2,018 filas · 9 columnas
    • customer_idinteger
    • first_namevarchar
    • last_namevarchar
    • emailvarchar
    • cityvarchar
    • statevarchar
    • signup_datedate
    • segmentvarchar
    • referral_sourcevarchar
    Primeras 5 filas de customers
    customer_idfirst_namelast_nameemailcitystatesignup_datesegmentreferral_source
    1OwenHudsonowen.hudson@icloud.comSan FranciscoCA2022-06-02consumersearch
    2DouglasMendozadmendoza69@gmail.comAtlantaGA2022-06-02consumerNULL
    3HenryBrookshbrooks@lakesidecafe.comLos AngelesCA2022-06-04businessNULL
    4BrianGrahambgraham@bluecedarhomes.comSeattleWA2022-06-06businesspinterest
    5KyleJimenezkjimenez27@yahoo.comIndianapolisIN2022-06-07consumerNULL
    products120 filas · 8 columnas
    • product_idinteger
    • namevarchar
    • categoryvarchar
    • subcategoryvarchar
    • unit_pricedecimal
    • unit_costdecimal
    • launched_ondate
    • is_activeboolean
    Primeras 5 filas de products
    product_idnamecategorysubcategoryunit_priceunit_costlaunched_onis_active
    101Vale Velvet LoveseatFurnitureSofas1659.00NULL2023-09-11true
    102Alder Oak Coffee TableFurnitureTables919.00503.502024-05-16true
    103Orchard Rattan Dining ChairFurnitureChairs789.00429.872023-05-27true
    104Upland Oak BookcaseFurnitureStorage429.00214.702022-12-20true
    105Avery Leather Bed FrameFurnitureBeds449.00232.702021-08-31true
    order_items30,338 filas · 6 columnas
    • order_item_idinteger
    • order_idinteger
    • product_idinteger
    • quantityinteger
    • unit_pricedecimal
    • discount_pctdecimal
    Primeras 5 filas de order_items
    order_item_idorder_idproduct_idquantityunit_pricediscount_pct
    11001121931.990.00
    21001154311.990.00
    31002154411.990.00
    410021941149.000.00
    51002193219.990.00
    returns1,673 filas · 5 columnas
    • return_idinteger
    • order_item_idinteger
    • returned_ondate
    • reasonvarchar
    • refund_amountdecimal
    Primeras 5 filas de returns
    return_idorder_item_idreturned_onreasonrefund_amount
    1142023-01-10damaged83.69
    2422023-01-10wrong_item19.99
    31052023-01-14wrong_item10.99
    4242023-01-16changed_mind26.99
    51262023-01-16late20.99
    employees60 filas · 8 columnas
    • employee_idinteger
    • first_namevarchar
    • last_namevarchar
    • departmentvarchar
    • titlevarchar
    • manager_idinteger
    • hire_datedate
    • salaryinteger
    Primeras 5 filas de employees
    employee_idfirst_namelast_namedepartmenttitlemanager_idhire_datesalary
    1CatherineHaleExecutiveChief Executive OfficerNULL2016-03-01285000
    2RobertKimExecutiveChief Operating Officer12017-01-09235000
    3MeganCollinsSalesHead of Sales12018-04-16172000
    4ChloeGutierrezSalesAccount Executive32020-01-2172000
    5FrankBellSalesAccount Executive32023-05-2173000
    web_sessions40,000 filas · 7 columnas
    • session_idinteger
    • customer_idinteger
    • started_attimestamp
    • devicevarchar
    • sourcevarchar
    • pages_viewedinteger
    • convertedboolean
    Primeras 5 filas de web_sessions
    session_idcustomer_idstarted_atdevicesourcepages_viewedconverted
    1NULL2023-01-01 23:02:24mobilepaid1false
    2182023-01-01 15:07:49desktoppaid1false
    3NULL2023-01-01 16:55:46desktopdirect7false
    4NULL2023-01-01 12:43:28mobileorganic3false
    5NULL2023-01-01 13:06:21mobilesocial2false
    marketing_spend3,276 filas · 3 columnas
    • spend_datedate
    • channelvarchar
    • amountdecimal
    Primeras 5 filas de marketing_spend
    spend_datechannelamount
    2023-01-01paid492.99
    2023-01-01email37.38
    2023-01-01social200.53
    2023-01-02paid709.13
    2023-01-02email64.13

    La lección

    Dos sistemas pueden contar los mismos pedidos y aun así discrepar todos los días. Si uno cuenta por días del Este y el otro por días UTC, los pedidos de la tarde caen en fechas distintas.

    Hora local frente a UTC

    Harbor & Pine guarda order_date en hora local de la tienda, US Eastern, como un TIMESTAMP sin zona horaria asociada. Las plataformas de anuncios suelen reportar en UTC. A finales de noviembre, la hora estándar del Este es UTC-5: un pedido a las 21:30 del viernes 28 de noviembre en Nueva York son las 02:30 del sábado 29 de noviembre en UTC.

    Los pedidos tienen su pico por la tarde, así que no es un problema de redondeo. Solo entre las 19:00 y la medianoche del Black Friday, 18 pedidos pasan al siguiente día UTC.

    Qué hace el starter

    Etiqueta días locales como utc_day, y filtra en hora local. Compara las dos versiones:

    utc_day starter (días locales) corregido (días UTC)
    2025-11-28 56 43
    2025-11-29 51 55
    2025-11-30 58 59
    2025-12-01 67 53

    La versión UTC del 28 de noviembre va de las 19:00 del 27 de noviembre a las 19:00 del 28 de noviembre en hora local.

    La solución

    Convierte una sola vez y usa el valor convertido en todas partes:

    CAST(order_date + INTERVAL 5 HOUR AS DATE) AS utc_day
    ...
    WHERE order_date + INTERVAL 5 HOUR >= '2025-11-28'
      AND order_date + INTERVAL 5 HOUR < '2025-12-02'

    Un desfase fijo es correcto aquí porque toda la ventana cae en horario estándar: el horario de verano terminó el 2 de noviembre de 2025. En un rango que cruce un cambio de horario de verano, un desfase fijo está mal en parte de él (el Este es UTC-4 en verano), y deberías usar una conversión de zona horaria real como AT TIME ZONE 'America/New_York' en Postgres o el CONVERT_TIMEZONE de Snowflake, que conocen el calendario del horario de verano.

    Errores comunes

    • Desplazar la etiqueta pero no el filtro: la ventana sigue empezando y terminando a medianoche local, así que el primer y el último día UTC quedan incompletos.
    • Restar en lugar de sumar. UTC está por delante de las zonas horarias de EE. UU.
    • Suponer la zona horaria de una columna por su nombre. Revisa la documentación de los datos o pregunta al ingeniero dueño del pipeline.

    En SQL Server

    SQL Server 2016+ convierte con nombres de zona de Windows, que manejan el horario de verano:

    SELECT CAST(order_date AT TIME ZONE 'Eastern Standard Time'
                           AT TIME ZONE 'UTC' AS date) AS utc_day
    FROM orders;

    El primer AT TIME ZONE dice qué es el valor guardado; el segundo lo convierte. DATEADD(hour, 5, order_date) es la versión con desfase fijo.

    En el trabajo

    El gasto en anuncios, la analítica web y los sistemas de pago suelen usar cada uno un reloj distinto. Indica la zona horaria junto a cada número diario que publiques.

    Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.