1. Faro

Nivel 3 · Pedidos de marzo de 2024

La solicitud

De Kevin Brooks, Gerente de Operaciones

“Un transportista está disputando algunos envíos de marzo de 2024. Saca todos los pedidos hechos en marzo de 2024, con cualquier estado, con la fecha y el costo de envío.”

Tu objetivo

Desde orders, devuelve order_id, order_date y shipping_fee de todos los pedidos cuyo order_date cae en marzo de 2024 (desde 2024-03-01 00:00 hasta, pero sin incluir, 2024-04-01 00:00).

  • Lee de la tabla orderspendiente
  • Muestra exactamente order_id order_date shipping_feependiente
  • 300 filaspendiente

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

    Los filtros de fecha están en todas partes en analítica: el mes pasado, este trimestre, lo que va del año. También son el origen de muchos números equivocados sin que nadie se dé cuenta.

    Fechas vs timestamps

    signup_date en customers es un DATE: solo un día, como 2024-03-31. order_date en orders es un TIMESTAMP: un día más una hora, como 2024-03-31 18:42:10. Cuando comparas un timestamp con un literal de fecha como '2024-03-31', el literal se trata como la medianoche al inicio de ese día, 2024-03-31 00:00:00.

    La trampa de BETWEEN

    BETWEEN a AND b significa >= a AND <= b. Parece perfecto para “marzo”:

    -- bug: misses almost all of March 31
    WHERE order_date BETWEEN '2024-03-01' AND '2024-03-31'

    El límite superior es 2024-03-31 00:00:00, así que un pedido a las 9 am del 31 de marzo queda excluido. La gente “lo arregla” con '2024-03-31 23:59:59', que aún pierde cualquier cosa del último segundo y se rompe cuando los timestamps tienen milisegundos.

    El rango semiabierto

    El patrón estándar de los analistas es: a partir del primer momento, inclusive, y estrictamente antes del primer momento del período siguiente.

    WHERE order_date >= '2024-03-01'
      AND order_date <  '2024-04-01'

    Funciona para fechas y timestamps, nunca cuenta dos veces un límite cuando apilas meses consecutivos, y deja que la base de datos use un índice sobre order_date.

    También verás WHERE CAST(order_date AS DATE) BETWEEN '2024-03-01' AND '2024-03-31' o WHERE DATE_TRUNC('month', order_date) = '2024-03-01'. Ambos devuelven las filas correctas, pero envolver la columna en una función suele impedir el uso del índice, lo que importa en tablas grandes en Postgres y MySQL. Prefiere el rango semiabierto.

    Notas por dialecto

    • Postgres y DuckDB aceptan '2024-03-01' y lo convierten automáticamente. Puedes ser explícito con DATE '2024-03-01' o TIMESTAMP '2024-03-01 00:00:00'.
    • BigQuery separa estrictamente DATE, DATETIME y TIMESTAMP y puede necesitar TIMESTAMP('2024-03-01').
    • MySQL acepta la cadena entre comillas igual que Postgres.
    • Zonas horarias: Harbor & Pine guarda los timestamps sin zona horaria. En almacenes de datos reales, comprueba si “marzo” significa UTC o la hora local del negocio. Cambia los números en los bordes.

    Errores comunes

    • BETWEEN con timestamps, como arriba.
    • Usar <= '2024-03-31' con un timestamp, que es el mismo error de otra forma.
    • Escribir fechas en un formato regional como '03/01/2024'. Usa siempre ISO YYYY-MM-DD.

    En SQL Server

    El rango semiabierto funciona sin cambios en columnas date y datetime, y la trampa de BETWEEN es la misma. También encontrarás YEAR() y MONTH() allí, y GETDATE() para “ahora” donde DuckDB usa now() o current_date:

    WHERE order_date >= '2024-03-01' AND order_date < '2024-04-01'   -- index-friendly
    WHERE YEAR(order_date) = 2024 AND MONTH(order_date) = 3          -- same rows, slower on big tables

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