La solicitud

De Brian Mitchell, Analista Financiero
Tu objetivo
Arregla la consulta. Para los pedidos completados realizados del 2025-10-01 al 2025-12-31 (a cualquier hora del día), devuelve una fila por mes con: month (un DATE, el primero del mes), orders (número de pedidos distintos) y net_revenue (suma de quantity * unit_price * (1 - discount_pct / 100.0) sobre líneas con quantity > 0, redondeada a 2). Ordena por month ascendente.
- Lee de la tabla
orderspendiente - Lee de la tabla
order_itemspendiente - Muestra exactamente
monthordersnet_revenuependiente
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 Brian, 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 |
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 |
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 |
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
Octubre y noviembre coinciden con el sistema de pedidos, diciembre está corto. Cuando solo el borde de un rango de fechas está mal, mira cómo termina el rango.
Qué significa BETWEEN sobre un timestamp
order_date es un TIMESTAMP. Compararlo con la cadena '2025-12-31' convierte la cadena en
2025-12-31 00:00:00, el primerísimo segundo del día. BETWEEN es inclusivo en ambos extremos, pero el
final es medianoche, así que conserva solo los pedidos hechos exactamente a las 00:00:00 del 31 de
diciembre.
El 31 de diciembre de 2025 hubo 25 pedidos entre las 05:18 y las 23:23. Once de ellos se completaron, y
son exactamente la diferencia: 623 frente a 634 pedidos, y $281,531.76 frente a $288,591.06 de ingresos.
En el año completo, BETWEEN '2025-01-01' AND '2025-12-31' encuentra 4,758 pedidos de todos los estados
en lugar de 4,783.
La versión con igualdad del mismo fallo
SELECT COUNT(*) FROM orders WHERE order_date = '2025-11-28';
Esto devuelve 0 para el Black Friday, que tuvo 56 pedidos. La igualdad con una cadena de fecha solo coincide con timestamps a medianoche.
La solución: rangos semiabiertos
WHERE o.order_date >= '2025-10-01'
AND o.order_date < '2026-01-01'
Inicio inclusivo, fin exclusivo, en el primer instante que no quieres. Funciona igual con fechas y con
timestamps, no necesita adivinar 23:59:59, y los rangos de mes encadenan sin huecos ni solapamientos.
Para un solo día, >= '2025-11-28' AND < '2025-11-29' devuelve los 56 pedidos.
Convertir la columna, CAST(order_date AS DATE) BETWEEN ..., también da las filas correctas, pero aplica
una función a cada fila e impide que muchas bases de datos usen un índice sobre order_date.
Errores comunes
<= '2025-12-31 23:59:59': se pierde cualquier cosa con segundos fraccionarios después de las 23:59:59.BETWEEN '2025-10-01' AND '2026-01-01': inclusivo, así que atraería pedidos hechos exactamente a medianoche del día de Año Nuevo.- Arreglar el
WHEREpero no revisar elGROUP BY: aquí el truncado del mes ya estaba bien.
En SQL Server
DATETIME y DATETIME2 se comportan igual: BETWEEN '2025-10-01' AND '2025-12-31' se detiene a
medianoche. Usa el mismo rango semiabierto, o compara con CAST(order_date AS date) para comprobaciones
puntuales:
WHERE order_date >= '2025-10-01' AND order_date < '2026-01-01'
En el trabajo
“El último día está corto” es tan común que muchos equipos prohíben BETWEEN sobre timestamps en la
revisión de código.
¡Linterna encendida!
Practicaste: debuggingbetweentimestampdate rangehalf open range
- Resuelto
- Sin pistas
- Al primer intento
