La solicitud

De Kevin Brooks, Gerente de Operaciones
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_idorder_dateshipping_feependiente - 300 filaspendiente
Tu consulta
Cargando el editor…
Solución de referencia
| order_id | customer_id | order_date | status | channel |
|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Kevin, y por qué
Tablas
Datos de la tienda Harbor & Pine, listos para consultar.
orders12,000 filas · 7 columnas
order_idintegercustomer_idintegerorder_datetimestampstatusvarcharchannelvarcharshipping_feedecimalcoupon_codevarchar
| order_id | customer_id | order_date | status | channel | shipping_fee | coupon_code |
|---|---|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web | 0.00 | NULL |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web | 0.00 | NULL |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace | 4.99 | WELCOME10 |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace | 4.99 | WELCOME10 |
| 1005 | 82 | 2023-01-02 11:43:36 | completed | web | 0.00 | WELCOME10 |
customers2,018 filas · 9 columnas
customer_idintegerfirst_namevarcharlast_namevarcharemailvarcharcityvarcharstatevarcharsignup_datedatesegmentvarcharreferral_sourcevarchar
| customer_id | first_name | last_name | city | state | signup_date | segment | referral_source | |
|---|---|---|---|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco | CA | 2022-06-02 | consumer | search |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta | GA | 2022-06-02 | consumer | NULL |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles | CA | 2022-06-04 | business | NULL |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle | WA | 2022-06-06 | business | |
| 5 | Kyle | Jimenez | kjimenez27@yahoo.com | Indianapolis | IN | 2022-06-07 | consumer | NULL |
products120 filas · 8 columnas
product_idintegernamevarcharcategoryvarcharsubcategoryvarcharunit_pricedecimalunit_costdecimallaunched_ondateis_activeboolean
| product_id | name | category | subcategory | unit_price | unit_cost | launched_on | is_active |
|---|---|---|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 | NULL | 2023-09-11 | true |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 | 503.50 | 2024-05-16 | true |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 | 429.87 | 2023-05-27 | true |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 | 214.70 | 2022-12-20 | true |
| 105 | Avery Leather Bed Frame | Furniture | Beds | 449.00 | 232.70 | 2021-08-31 | true |
order_items30,338 filas · 6 columnas
order_item_idintegerorder_idintegerproduct_idintegerquantityintegerunit_pricedecimaldiscount_pctdecimal
| order_item_id | order_id | product_id | quantity | unit_price | discount_pct |
|---|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 | 0.00 |
| 2 | 1001 | 154 | 3 | 11.99 | 0.00 |
| 3 | 1002 | 154 | 4 | 11.99 | 0.00 |
| 4 | 1002 | 194 | 1 | 149.00 | 0.00 |
| 5 | 1002 | 193 | 2 | 19.99 | 0.00 |
returns1,673 filas · 5 columnas
return_idintegerorder_item_idintegerreturned_ondatereasonvarcharrefund_amountdecimal
| return_id | order_item_id | returned_on | reason | refund_amount |
|---|---|---|---|---|
| 1 | 14 | 2023-01-10 | damaged | 83.69 |
| 2 | 42 | 2023-01-10 | wrong_item | 19.99 |
| 3 | 105 | 2023-01-14 | wrong_item | 10.99 |
| 4 | 24 | 2023-01-16 | changed_mind | 26.99 |
| 5 | 126 | 2023-01-16 | late | 20.99 |
employees60 filas · 8 columnas
employee_idintegerfirst_namevarcharlast_namevarchardepartmentvarchartitlevarcharmanager_idintegerhire_datedatesalaryinteger
| employee_id | first_name | last_name | department | title | manager_id | hire_date | salary |
|---|---|---|---|---|---|---|---|
| 1 | Catherine | Hale | Executive | Chief Executive Officer | NULL | 2016-03-01 | 285000 |
| 2 | Robert | Kim | Executive | Chief Operating Officer | 1 | 2017-01-09 | 235000 |
| 3 | Megan | Collins | Sales | Head of Sales | 1 | 2018-04-16 | 172000 |
| 4 | Chloe | Gutierrez | Sales | Account Executive | 3 | 2020-01-21 | 72000 |
| 5 | Frank | Bell | Sales | Account Executive | 3 | 2023-05-21 | 73000 |
web_sessions40,000 filas · 7 columnas
session_idintegercustomer_idintegerstarted_attimestampdevicevarcharsourcevarcharpages_viewedintegerconvertedboolean
| session_id | customer_id | started_at | device | source | pages_viewed | converted |
|---|---|---|---|---|---|---|
| 1 | NULL | 2023-01-01 23:02:24 | mobile | paid | 1 | false |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid | 1 | false |
| 3 | NULL | 2023-01-01 16:55:46 | desktop | direct | 7 | false |
| 4 | NULL | 2023-01-01 12:43:28 | mobile | organic | 3 | false |
| 5 | NULL | 2023-01-01 13:06:21 | mobile | social | 2 | false |
marketing_spend3,276 filas · 3 columnas
spend_datedatechannelvarcharamountdecimal
| spend_date | channel | amount |
|---|---|---|
| 2023-01-01 | paid | 492.99 |
| 2023-01-01 | 37.38 | |
| 2023-01-01 | social | 200.53 |
| 2023-01-02 | paid | 709.13 |
| 2023-01-02 | 64.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 conDATE '2024-03-01'oTIMESTAMP '2024-03-01 00:00:00'. - BigQuery separa estrictamente
DATE,DATETIMEyTIMESTAMPy puede necesitarTIMESTAMP('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
BETWEENcon 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 ISOYYYY-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 ¡Linterna encendida!
Practicaste: datestimestampbetweenhalf open range
- Resuelto
- Sin pistas
- Al primer intento
