{"id":1711,"date":"2024-12-05T20:12:48","date_gmt":"2024-12-05T23:12:48","guid":{"rendered":"https:\/\/martafagundez.com\/codevolution\/?p=1711"},"modified":"2025-04-18T00:32:50","modified_gmt":"2025-04-18T03:32:50","slug":"gestion-de-fechas-en-sqlalchemy","status":"publish","type":"post","link":"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/","title":{"rendered":"Gesti\u00f3n de Fechas en SQLAlchemy"},"content":{"rendered":"\n<p>La gesti\u00f3n de fechas y horas es un aspecto fundamental en el desarrollo de aplicaciones modernas, especialmente en sistemas que dependen de la <strong>sincronizaci\u00f3n, registro de eventos o el manejo de tiempo en distintas zonas horarias<\/strong>.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.sqlalchemy.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">SQLAlchemy<\/a>, como ORM poderoso en Python, ofrece herramientas y funcionalidades para trabajar eficientemente con datos temporales en bases de datos relacionales.<\/p>\n\n\n\n<p>En este art\u00edculo, exploraremos c\u00f3mo manejar correctamente fechas y horas en SQLAlchemy, desde la definici\u00f3n de modelos hasta las mejores pr\u00e1cticas para evitar errores comunes.<\/p>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h2 class=\"simpletoc-title\">Tabla de contenidos<\/h2>\n<style>html { scroll-behavior: smooth; }<\/style><ul class=\"simpletoc-list\">\n<li><a href=\"#por-que-es-importante-la-correcta-gestion-de-fechas-en-sqlalchemy\">\u00bfPor Qu\u00e9 Es Importante la Correcta Gesti\u00f3n de Fechas en SQLAlchemy?<\/a>\n\n<\/li>\n<li><a href=\"#tipos-de-datos-para-fechas-y-horas-en-sqlalchemy\">Tipos de Datos para Fechas y Horas en SQLAlchemy<\/a>\n\n\n<ul><li>\n<a href=\"#1-date\">1. Date<\/a>\n\n<\/li>\n<li><a href=\"#2-time\">2. Time<\/a>\n\n<\/li>\n<li><a href=\"#3-datetime\">3. DateTime<\/a>\n\n<\/li>\n<li><a href=\"#4-interval\">4. Interval<\/a>\n\n<\/li>\n<\/ul>\n<li><a href=\"#casos-de-uso-comunes-en-modelos\">Casos de Uso Comunes en Modelos<\/a>\n\n\n<ul><li>\n<a href=\"#1-campos-de-auditoria\">1. Campos de Auditor\u00eda<\/a>\n\n<\/li>\n<li><a href=\"#2-registro-de-eventos\">2. Registro de Eventos<\/a>\n\n<\/li>\n<li><a href=\"#3-gestion-de-citas\">3. Gesti\u00f3n de Citas<\/a>\n\n<\/li>\n<\/ul>\n<li><a href=\"#ejemplos-de-consultas-con-campos-temporales\">Ejemplos de Consultas con Campos Temporales<\/a>\n\n\n<ul><li>\n<a href=\"#1-consultar-registros-de-hoy\">1. Consultar Registros de Hoy<\/a>\n\n<\/li>\n<li><a href=\"#2-filtrar-registros-de-los-ultimos-7-dias\">2. Filtrar Registros de los \u00daltimos 7 D\u00edas<\/a>\n\n<\/li>\n<li><a href=\"#3-filtrar-registros-por-hora-exacta\">3. Filtrar Registros por Hora Exacta<\/a>\n\n<\/li>\n<li><a href=\"#4-buscar-registros-en-el-pasado\">4. Buscar Registros en el Pasado<\/a>\n\n<\/li>\n<li><a href=\"#5-buscar-registros-en-el-futuro\">5. Buscar Registros en el Futuro<\/a>\n\n<\/li>\n<li><a href=\"#6-filtrar-registros-dentro-de-un-mes\">6. Filtrar Registros Dentro de un Mes<\/a>\n\n<\/li>\n<li><a href=\"#7-consultar-registros-dentro-de-un-ano-especifico\">7. Consultar Registros Dentro de un A\u00f1o Espec\u00edfico<\/a>\n\n<\/li>\n<li><a href=\"#8-encontrar-registros-que-cruzan-un-intervalo-de-tiempo\">8. Encontrar Registros Que Cruzan un Intervalo de Tiempo<\/a>\n\n<\/li>\n<li><a href=\"#9-agrupar-registros-por-dia-mes-ano\">9. Agrupar Registros por D\u00eda, Mes, A\u00f1o<\/a>\n\n\n<\/li>\n\n<\/li>\n\n<li><a href=\"#10-filtrar-por-duracion-usando-interval\">10. Filtrar por Duraci\u00f3n Usando Interval<\/a>\n\n<\/li>\n<li><a href=\"#11-consultar-el-registro-mas-reciente-o-mas-antiguo\">11. Consultar el Registro M\u00e1s Reciente o M\u00e1s Antiguo<\/a>\n\n<\/li>\n<li><a href=\"#12-combinar-fechas-y-hora-en-consultas\">12. Combinar Fechas y Hora en Consultas<\/a>\n\n<\/li>\n<li><a href=\"#13-comparar-duraciones-entre-columnas\">13. Comparar Duraciones Entre Columnas<\/a>\n\n<\/li>\n<li><a href=\"#14-consultar-fechas-relativas-usando-funciones-sql\">14. Consultar Fechas Relativas Usando Funciones SQL<\/a>\n\n<\/li>\n<\/ul>\n<li><a href=\"#buenas-practicas-al-manejar-fechas-en-sqlalchemy\">Buenas Pr\u00e1cticas al Manejar Fechas en SQLAlchemy<\/a>\n\n<\/li>\n<li><a href=\"#conclusion\">Conclusi\u00f3n<\/a>\n<\/li><\/ul>\n\n\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"por-que-es-importante-la-correcta-gestion-de-fechas-en-sqlalchemy\"><strong>\u00bfPor Qu\u00e9 Es Importante la Correcta Gesti\u00f3n de Fechas en SQLAlchemy?<\/strong><\/h2>\n\n\n<p>Al desarrollar una API, las fechas juegan un papel cr\u00edtico, especialmente en escenarios donde los datos temporales (como citas, eventos o registros) son fundamentales. <\/p>\n\n\n\n<p>Una mala gesti\u00f3n de fechas puede ocasionar:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Inconsistencias en zonas horarias<\/strong>.<\/li>\n\n\n\n<li><strong>Errores al comparar fechas<\/strong> debido a formatos incorrectos.<\/li>\n\n\n\n<li><strong>P\u00e9rdida de precisi\u00f3n en operaciones temporales<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p>SQLAlchemy proporciona tipos de datos especializados y m\u00e9todos para simplificar estas tareas.<\/p>\n\n\n\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"tipos-de-datos-para-fechas-y-horas-en-sqlalchemy\"><strong>Tipos de Datos para Fechas y Horas en SQLAlchemy<\/strong><\/h2>\n\n\n<p>SQLAlchemy ofrece los siguientes tipos para trabajar con datos temporales:<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"1-date\">1. <code>Date<\/code><\/h3>\n\n\n<p>Representa una fecha sin informaci\u00f3n de hora. Utilizado para campos como cumplea\u00f1os o fechas espec\u00edficas.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(251, 251, 239, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import datetime\nfrom sqlalchemy import Date\nfrom sqlalchemy.orm import Mapped, mapped_column\n# ...dem\u00e1s c\u00f3digo\n\nclass User(Base):\n    __tablename__ = 'users'\n    id: Mapped[int] = mapped_column(primary_key=True)\n    birth_date: Mapped[datetime.date] = mapped_column(Date())\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> datetime<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> Date<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy.orm <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> Mapped, mapped_column<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">class<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #97E1F1\">User<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #97E1F1; font-style: italic\">Base<\/span><span style=\"color: #F6F6F4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    __tablename__ <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">users<\/span><span style=\"color: #DEE492\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #97E1F1\">id<\/span><span style=\"color: #F6F6F4\">: Mapped[<\/span><span style=\"color: #97E1F1; font-style: italic\">int<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> mapped_column(<\/span><span style=\"color: #FFB86C; font-style: italic\">primary_key<\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #BF9EEE\">True<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F6F6F4\">    birth_date: Mapped[datetime.date] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> mapped_column(Date())<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"2-time\">2. <code>Time<\/code><\/h3>\n\n\n<p>Representa solo la hora del d\u00eda, \u00fatil para horarios recurrentes o campos de tiempo sin fecha asociada.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(251, 251, 239, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import datetime\nfrom sqlalchemy import Time\nfrom sqlalchemy.orm import Mapped, mapped_column\n# ...dem\u00e1s c\u00f3digo\n\nclass Schedule(Base):\n    __tablename__ = 'schedules'\n    # ... otros campos\n    start_time: Mapped[datetime.time] = mapped_column(Time())\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> datetime<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> Time<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy.orm <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> Mapped, mapped_column<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">class<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #97E1F1\">Schedule<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #97E1F1; font-style: italic\">Base<\/span><span style=\"color: #F6F6F4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    __tablename__ <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">schedules<\/span><span style=\"color: #DEE492\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\"># ... otros campos<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F6F6F4\">    start_time: Mapped[datetime.time] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> mapped_column(Time())<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"3-datetime\">3. <code>DateTime<\/code><\/h3>\n\n\n<p>Almacena una fecha completa con hora, incluyendo opcionalmente informaci\u00f3n de zona horaria.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(251, 251, 239, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import datetime\nfrom sqlalchemy import DateTime\nfrom sqlalchemy.orm import Mapped, mapped_column\n# ...dem\u00e1s c\u00f3digo\n\nclass Appointment(Base):\n    __tablename__ = 'appointments'\n    # ... otros campos\n    start_datetime: Mapped[datetime.datetime] = mapped_column(\n        DateTime(timezone=True))\n    end_datetime: Mapped[datetime.datetime] = mapped_column(\n        DateTime(timezone=True))\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> datetime<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> DateTime<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy.orm <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> Mapped, mapped_column<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">class<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #97E1F1\">Appointment<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #97E1F1; font-style: italic\">Base<\/span><span style=\"color: #F6F6F4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    __tablename__ <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">appointments<\/span><span style=\"color: #DEE492\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\"># ... otros campos<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F6F6F4\">    start_datetime: Mapped[datetime.datetime] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> mapped_column(<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F6F6F4\">        DateTime(<\/span><span style=\"color: #FFB86C; font-style: italic\">timezone<\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #BF9EEE\">True<\/span><span style=\"color: #F6F6F4\">))<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F6F6F4\">    end_datetime: Mapped[datetime.datetime] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> mapped_column(<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F6F6F4\">        DateTime(<\/span><span style=\"color: #FFB86C; font-style: italic\">timezone<\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #BF9EEE\">True<\/span><span style=\"color: #F6F6F4\">))<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"4-interval\">4. <code>Interval<\/code><\/h3>\n\n\n<p>Representa un intervalo de tiempo. \u00datil para calcular duraciones.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(251, 251, 239, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import datetime\nfrom sqlalchemy import Interval\nfrom sqlalchemy.orm import Mapped, mapped_column\n# ...dem\u00e1s c\u00f3digo\n\nclass Task(Base):\n    __tablename__ = 'tasks'\n    # ... otros campos\n    duration: Mapped[datetime.timedelta] = mapped_column(Interval())\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> datetime<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> Interval<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy.orm <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> Mapped, mapped_column<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">class<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #97E1F1\">Task<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #97E1F1; font-style: italic\">Base<\/span><span style=\"color: #F6F6F4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    __tablename__ <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">tasks<\/span><span style=\"color: #DEE492\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #7B7F8B\"># ... otros campos<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #F6F6F4\">    duration: Mapped[datetime.timedelta] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> mapped_column(Interval())<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"casos-de-uso-comunes-en-modelos\"><strong>Casos de Uso Comunes en Modelos<\/strong><\/h2>\n\n<h3 class=\"wp-block-heading\" id=\"1-campos-de-auditoria\"><strong>1. Campos de Auditor\u00eda<\/strong><\/h3>\n\n\n<p>Los campos <code>created_at<\/code> y <code>updated_at<\/code> son est\u00e1ndar para rastrear cambios en registros.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import datetime\nfrom sqlalchemy import DateTime\nfrom sqlalchemy.orm import Mapped, mapped_column\n# ...dem\u00e1s c\u00f3digo\n\nclass BaseModel(Base):\n    __abstract__ = True\n    created_at: Mapped[datetime.datetime] = mapped_column(\n        DateTime(timezone=True), default=datetime.datetime.now)\n    updated_at: Mapped[datetime.datetime] = mapped_column(\n        DateTime(timezone=True), default=datetime.datetime.now, onupdate=datetime.datetime.now)\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> datetime<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> DateTime<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy.orm <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> Mapped, mapped_column<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">class<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #97E1F1\">BaseModel<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #97E1F1; font-style: italic\">Base<\/span><span style=\"color: #F6F6F4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    __abstract__ <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">True<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    created_at: Mapped[datetime.datetime] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> mapped_column(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        DateTime(<\/span><span style=\"color: #FFB86C; font-style: italic\">timezone<\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #BF9EEE\">True<\/span><span style=\"color: #F6F6F4\">), <\/span><span style=\"color: #FFB86C; font-style: italic\">default<\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\">datetime.datetime.now)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    updated_at: Mapped[datetime.datetime] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> mapped_column(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        DateTime(<\/span><span style=\"color: #FFB86C; font-style: italic\">timezone<\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #BF9EEE\">True<\/span><span style=\"color: #F6F6F4\">), <\/span><span style=\"color: #FFB86C; font-style: italic\">default<\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\">datetime.datetime.now, <\/span><span style=\"color: #FFB86C; font-style: italic\">onupdate<\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\">datetime.datetime.now)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"2-registro-de-eventos\"><strong>2. Registro de Eventos<\/strong><\/h3>\n\n\n<p>Para sistemas que requieren rastrear actividades, calendarios, etc.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import datetime\nfrom sqlalchemy import DateTime\nfrom sqlalchemy.orm import Mapped, mapped_column\n# ...dem\u00e1s c\u00f3digo\n\nclass Event(Base):\n    __tablename__ = 'events'\n    id: Mapped[int] = mapped_column(primary_key=True)\n    event_datetime: Mapped[datetime.datetime] = mapped_column(DateTime(timezone=True))\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> datetime<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> DateTime<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy.orm <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> Mapped, mapped_column<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">class<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #97E1F1\">Event<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #97E1F1; font-style: italic\">Base<\/span><span style=\"color: #F6F6F4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    __tablename__ <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">events<\/span><span style=\"color: #DEE492\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #97E1F1\">id<\/span><span style=\"color: #F6F6F4\">: Mapped[<\/span><span style=\"color: #97E1F1; font-style: italic\">int<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> mapped_column(<\/span><span style=\"color: #FFB86C; font-style: italic\">primary_key<\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #BF9EEE\">True<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    event_datetime: Mapped[datetime.datetime] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> mapped_column(DateTime(<\/span><span style=\"color: #FFB86C; font-style: italic\">timezone<\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #BF9EEE\">True<\/span><span style=\"color: #F6F6F4\">))<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"3-gestion-de-citas\"><strong>3. Gesti\u00f3n de Citas<\/strong><\/h3>\n\n\n<p>Con <code>start_datetime<\/code> y <code>end_datetime<\/code> se puede manejar reservas y eventos.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import datetime\nfrom sqlalchemy import DateTime\nfrom sqlalchemy.orm import Mapped, mapped_column\n# ...dem\u00e1s c\u00f3digo\n\nclass Appointment(Base):\n    __tablename__ = 'appointments'\n    id: Mapped[int] = mapped_column(primary_key=True)\n    start_datetime: Mapped[datetime.datetime] = mapped_column(DateTime(timezone=True))\n    end_datetime: Mapped[datetime.datetime] = mapped_column(DateTime(timezone=True))\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> datetime<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> DateTime<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy.orm <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> Mapped, mapped_column<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">class<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #97E1F1\">Appointment<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #97E1F1; font-style: italic\">Base<\/span><span style=\"color: #F6F6F4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    __tablename__ <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">appointments<\/span><span style=\"color: #DEE492\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #97E1F1\">id<\/span><span style=\"color: #F6F6F4\">: Mapped[<\/span><span style=\"color: #97E1F1; font-style: italic\">int<\/span><span style=\"color: #F6F6F4\">] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> mapped_column(<\/span><span style=\"color: #FFB86C; font-style: italic\">primary_key<\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #BF9EEE\">True<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    start_datetime: Mapped[datetime.datetime] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> mapped_column(DateTime(<\/span><span style=\"color: #FFB86C; font-style: italic\">timezone<\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #BF9EEE\">True<\/span><span style=\"color: #F6F6F4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    end_datetime: Mapped[datetime.datetime] <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> mapped_column(DateTime(<\/span><span style=\"color: #FFB86C; font-style: italic\">timezone<\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #BF9EEE\">True<\/span><span style=\"color: #F6F6F4\">))<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"ejemplos-de-consultas-con-campos-temporales\"><strong>Ejemplos de Consultas con Campos Temporales<\/strong><\/h2>\n\n\n<p>Los gestores de bases de datos est\u00e1n optimizados para operaciones como agrupado, ordenado y filtrado, utilizando \u00edndices, algoritmos eficientes y paralelismo interno.<\/p>\n\n\n\n<p>SQLAlchemy nos facilita el acceso a toda la potencia y eficiencia de las consultas SQL con m\u00e9todos y funciones especiales. Aqu\u00ed te comparto algunos ejemplos:<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"1-consultar-registros-de-hoy\"><strong>1. Consultar Registros de Hoy<\/strong><\/h3>\n\n\n<p>Si necesitas filtrar los registros correspondientes al d\u00eda actual:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"from datetime import date\n# ...dem\u00e1s c\u00f3digo\n\ntoday = date.today()\n\nquery = session.query(Event).filter(\n    Event.event_datetime.date() == today\n)\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> datetime <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> date<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">today <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> date.today()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">query <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(Event).filter(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Event.event_datetime.date() <\/span><span style=\"color: #F286C4\">==<\/span><span style=\"color: #F6F6F4\"> today<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"2-filtrar-registros-de-los-ultimos-7-dias\"><strong>2. Filtrar Registros de los \u00daltimos 7 D\u00edas<\/strong><\/h3>\n\n\n<p>Para obtener registros recientes en un rango espec\u00edfico:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"from datetime import UTC, datetime, timedelta\n# ...dem\u00e1s c\u00f3digo\n\nseven_days_ago = datetime.now(UTC) - timedelta(days=7)\n\nquery = session.query(Event).filter(\n    Event.event_datetime.date() &gt;= seven_days_ago\n)\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> datetime <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">UTC<\/span><span style=\"color: #F6F6F4\">, datetime, timedelta<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">seven_days_ago <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> datetime.now(<\/span><span style=\"color: #BF9EEE\">UTC<\/span><span style=\"color: #F6F6F4\">) <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\"> timedelta(<\/span><span style=\"color: #FFB86C; font-style: italic\">days<\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #BF9EEE\">7<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">query <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(Event).filter(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Event.event_datetime.date() <\/span><span style=\"color: #F286C4\">&gt;=<\/span><span style=\"color: #F6F6F4\"> seven_days_ago<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"3-filtrar-registros-por-hora-exacta\"><strong>3. Filtrar Registros por Hora Exacta<\/strong><\/h3>\n\n\n<p>Para encontrar registros que coincidan con una hora espec\u00edfica:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"from datetime import time\n# ...dem\u00e1s c\u00f3digo\n\nspecific_time = time(14, 0)  # 2:00 PM\n\nquery = session.query(Schedule).filter(\n    Schedule.start_time == specific_time\n)\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> datetime <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> time<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">specific_time <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> time(<\/span><span style=\"color: #BF9EEE\">14<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">)  <\/span><span style=\"color: #7B7F8B\"># 2:00 PM<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">query <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(Schedule).filter(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Schedule.start_time <\/span><span style=\"color: #F286C4\">==<\/span><span style=\"color: #F6F6F4\"> specific_time<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"4-buscar-registros-en-el-pasado\"><strong>4. Buscar Registros en el Pasado<\/strong><\/h3>\n\n\n<p>Si deseas encontrar todos los registros con fecha y hora anteriores al momento actual:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"from datetime import datetime, UTC\n# ...dem\u00e1s c\u00f3digo\n\nnow = datetime.now(UTC)\n\nquery = session.query(Appointment).filter(\n    Appointment.start_datetime &lt; now\n)\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> datetime <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> datetime, <\/span><span style=\"color: #BF9EEE\">UTC<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">now <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> datetime.now(<\/span><span style=\"color: #BF9EEE\">UTC<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">query <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(Appointment).filter(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Appointment.start_datetime <\/span><span style=\"color: #F286C4\">&lt;<\/span><span style=\"color: #F6F6F4\"> now<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"5-buscar-registros-en-el-futuro\"><strong>5. Buscar Registros en el Futuro<\/strong><\/h3>\n\n\n<p>Similar al anterior, pero para registros con fecha y hora posteriores al momento actual:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"from datetime import datetime, UTC\n# ...dem\u00e1s c\u00f3digo\n\nnow = datetime.now(UTC)\n\nquery = session.query(Appointment).filter(\n    Appointment.start_datetime &gt; now\n)\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> datetime <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> datetime, <\/span><span style=\"color: #BF9EEE\">UTC<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">now <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> datetime.now(<\/span><span style=\"color: #BF9EEE\">UTC<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">query <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(Appointment).filter(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Appointment.start_datetime <\/span><span style=\"color: #F286C4\">&gt;<\/span><span style=\"color: #F6F6F4\"> now<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"6-filtrar-registros-dentro-de-un-mes\"><strong>6. Filtrar Registros Dentro de un Mes<\/strong><\/h3>\n\n\n<p>Encuentra registros pertenecientes a un mes espec\u00edfico:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"from sqlalchemy import extract\n# ...dem\u00e1s c\u00f3digo\n\nquery = session.query(Event).filter(\n    extract('month', Event.event_datetime) == 12  # Diciembre\n)\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> extract<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">query <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(Event).filter(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    extract(<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">month<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">, Event.event_datetime) <\/span><span style=\"color: #F286C4\">==<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">12<\/span><span style=\"color: #F6F6F4\">  <\/span><span style=\"color: #7B7F8B\"># Diciembre<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"7-consultar-registros-dentro-de-un-ano-especifico\"><strong>7. Consultar Registros Dentro de un A\u00f1o Espec\u00edfico<\/strong><\/h3>\n\n\n<p>De manera similar, puedes filtrar registros dentro de un a\u00f1o espec\u00edfico:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"from sqlalchemy import extract\n# ...dem\u00e1s c\u00f3digo\n\nquery = session.query(Event).filter(\n    extract('year', Event.event_datetime) == 2024\n)\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> extract<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">query <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(Event).filter(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    extract(<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">year<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">, Event.event_datetime) <\/span><span style=\"color: #F286C4\">==<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">2024<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"8-encontrar-registros-que-cruzan-un-intervalo-de-tiempo\"><strong>8. Encontrar Registros Que Cruzan un Intervalo de Tiempo<\/strong><\/h3>\n\n\n<p>Para consultas m\u00e1s avanzadas, como encontrar citas que cruzan un rango de tiempo:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"from datetime import UTC, datetime\nfrom sqlalchemy import and_, or_\n# ...dem\u00e1s c\u00f3digo\n\ninterval_start = datetime.fromisoformat(&quot;2024-12-08T03:00:00-03:00&quot;)\ninterval_end = datetime.fromisoformat(&quot;2024-12-08T05:00:00-03:00&quot;)\ninterval_start_utc = interval_start.astimezone(UTC)\ninterval_end_utc = interval_end.astimezone(UTC)\n\n# Consulta appointments que abarcan completamente el intervalo especificado\nquery1 = session.query(Appointment).filter(\n    and_(\n        Appointment.start_datetime &lt;= interval_start_utc,\n        Appointment.end_datetime &gt;= interval_end_utc\n    )\n)\n\n# Consulta appointments que se solapan total o parcialmente con el intervalo especificado\nquery2 = session.query(Appointment).filter(\n    or_(\n        and_(\n            Appointment.start_datetime &lt;= interval_start_utc, \n            Appointment.end_datetime &gt; interval_start_utc\n        ),\n        and_(\n            Appointment.start_datetime &lt; interval_end_utc, \n            Appointment.end_datetime &gt; interval_start_utc\n        )\n    )\n)\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> datetime <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">UTC<\/span><span style=\"color: #F6F6F4\">, datetime<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> and_, or_<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">interval_start <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> datetime.fromisoformat(<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">2024-12-08T03:00:00-03:00<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">interval_end <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> datetime.fromisoformat(<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">2024-12-08T05:00:00-03:00<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">interval_start_utc <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> interval_start.astimezone(<\/span><span style=\"color: #BF9EEE\">UTC<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">interval_end_utc <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> interval_end.astimezone(<\/span><span style=\"color: #BF9EEE\">UTC<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># Consulta appointments que abarcan completamente el intervalo especificado<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">query1 <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(Appointment).filter(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    and_(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        Appointment.start_datetime <\/span><span style=\"color: #F286C4\">&lt;=<\/span><span style=\"color: #F6F6F4\"> interval_start_utc,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        Appointment.end_datetime <\/span><span style=\"color: #F286C4\">&gt;=<\/span><span style=\"color: #F6F6F4\"> interval_end_utc<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># Consulta appointments que se solapan total o parcialmente con el intervalo especificado<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">query2 <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(Appointment).filter(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    or_(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        and_(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            Appointment.start_datetime <\/span><span style=\"color: #F286C4\">&lt;=<\/span><span style=\"color: #F6F6F4\"> interval_start_utc, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            Appointment.end_datetime <\/span><span style=\"color: #F286C4\">&gt;<\/span><span style=\"color: #F6F6F4\"> interval_start_utc<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        and_(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            Appointment.start_datetime <\/span><span style=\"color: #F286C4\">&lt;<\/span><span style=\"color: #F6F6F4\"> interval_end_utc, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            Appointment.end_datetime <\/span><span style=\"color: #F286C4\">&gt;<\/span><span style=\"color: #F6F6F4\"> interval_start_utc<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"9-agrupar-registros-por-dia-mes-ano\"><strong>9. Agrupar Registros por D\u00eda, Mes, A\u00f1o<\/strong><\/h3>\n\n\n<p>Si necesitas agrupar y contar registros, hacerlo en la base de datos reduce el volumen de datos transferidos entre la base de datos y el cliente Python, ya que solo se devuelven los datos procesados.<\/p>\n\n\n\n<p>Utilizar <code>label()<\/code> en las columnas permite acceder a los resultados de manera m\u00e1s clara en el c\u00f3digo Python al procesar los datos obtenidos.<\/p>\n\n\n<h4 class=\"wp-block-heading\" id=\"agrupar-por-dia\"><strong>Agrupar por D\u00eda<\/strong><\/h4>\n\n\n<p>Generar un resultado donde cada fila corresponde a un d\u00eda espec\u00edfico y su respectivo conteo de registros:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"from sqlalchemy import func\n# ...dem\u00e1s c\u00f3digo\n\nquery = session.query(\n    func.date(Appointment.start_datetime).label(&quot;day&quot;), \n    func.count(Appointment.id).label(&quot;appointments_count&quot;)\n).group_by(\n    func.date((Appointment.start_datetime))\n)\n\nfor row in query.all():\n    print(f&quot;D\u00eda: {row.day}, Citas: {row.appointments_count}&quot;)\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> func<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">query <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    func.date(Appointment.start_datetime).label(<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">day<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">), <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    func.count(Appointment.id).label(<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">appointments_count<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">).group_by(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    func.date((Appointment.start_datetime))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">for<\/span><span style=\"color: #F6F6F4\"> row <\/span><span style=\"color: #F286C4\">in<\/span><span style=\"color: #F6F6F4\"> query.all():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #97E1F1\">print<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">f<\/span><span style=\"color: #E7EE98\">&quot;D\u00eda: <\/span><span style=\"color: #BF9EEE\">{<\/span><span style=\"color: #F6F6F4\">row.day<\/span><span style=\"color: #BF9EEE\">}<\/span><span style=\"color: #E7EE98\">, Citas: <\/span><span style=\"color: #BF9EEE\">{<\/span><span style=\"color: #F6F6F4\">row.appointments_count<\/span><span style=\"color: #BF9EEE\">}<\/span><span style=\"color: #E7EE98\">&quot;<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n<h4 class=\"wp-block-heading\" id=\"agrupar-por-ano\"><strong>Agrupar por A\u00f1o<\/strong><\/h4>\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"from sqlalchemy import extract, func\n# ...dem\u00e1s c\u00f3digo\n\nquery = session.query(\n    extract('year', Appointment.start_datetime).label('year'),  # Extrae el a\u00f1o\n    func.count(Appointment.id).label('appointments_count')  # Cuenta las citas\n).group_by(\n    extract('year', Appointment.start_datetime)  # Agrupa por a\u00f1o\n).order_by('year')  # Opcional: ordenar por el a\u00f1o\n\nfor row in query.all():\n    print(f&quot;A\u00f1o: {row.year}, Citas: {row.appointments_count}&quot;)\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> extract, func<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">query <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    extract(<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">year<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">, Appointment.start_datetime).label(<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">year<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">),  <\/span><span style=\"color: #7B7F8B\"># Extrae el a\u00f1o<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    func.count(Appointment.id).label(<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">appointments_count<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">)  <\/span><span style=\"color: #7B7F8B\"># Cuenta las citas<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">).group_by(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    extract(<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">year<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">, Appointment.start_datetime)  <\/span><span style=\"color: #7B7F8B\"># Agrupa por a\u00f1o<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">).order_by(<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">year<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">)  <\/span><span style=\"color: #7B7F8B\"># Opcional: ordenar por el a\u00f1o<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">for<\/span><span style=\"color: #F6F6F4\"> row <\/span><span style=\"color: #F286C4\">in<\/span><span style=\"color: #F6F6F4\"> query.all():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #97E1F1\">print<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">f<\/span><span style=\"color: #E7EE98\">&quot;A\u00f1o: <\/span><span style=\"color: #BF9EEE\">{<\/span><span style=\"color: #F6F6F4\">row.year<\/span><span style=\"color: #BF9EEE\">}<\/span><span style=\"color: #E7EE98\">, Citas: <\/span><span style=\"color: #BF9EEE\">{<\/span><span style=\"color: #F6F6F4\">row.appointments_count<\/span><span style=\"color: #BF9EEE\">}<\/span><span style=\"color: #E7EE98\">&quot;<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n<h4 class=\"wp-block-heading\" id=\"agrupar-por-mes-y-ano\"><strong>Agrupar por Mes y A\u00f1o<\/strong><\/h4>\n\n\n<p>Si deseas agrupar tanto por a\u00f1o como por mes (por ejemplo, contar citas por mes dentro de cada a\u00f1o):<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"from sqlalchemy import extract, func\n# ...dem\u00e1s c\u00f3digo\n\nquery = session.query(\n    extract('year', Appointment.start_datetime).label('year'),  # Extrae el a\u00f1o\n    extract('month', Appointment.start_datetime).label('month'),  # Extrae el mes\n    func.count(Appointment.id).label('appointments_count')  # Cuenta las citas\n).group_by(\n    extract('year', Appointment.start_datetime),  # Agrupa por a\u00f1o\n    extract('month', Appointment.start_datetime)  # Agrupa por mes\n).order_by('year', 'month')  # Opcional: ordenar por a\u00f1o y mes\n\nfor row in query.all():\n    print(f'A\u00f1o: {row.year}, Mes: {row.month}, Citas: {row.appointments_count}')\n    \" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> extract, func<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">query <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    extract(<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">year<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">, Appointment.start_datetime).label(<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">year<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">),  <\/span><span style=\"color: #7B7F8B\"># Extrae el a\u00f1o<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    extract(<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">month<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">, Appointment.start_datetime).label(<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">month<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">),  <\/span><span style=\"color: #7B7F8B\"># Extrae el mes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    func.count(Appointment.id).label(<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">appointments_count<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">)  <\/span><span style=\"color: #7B7F8B\"># Cuenta las citas<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">).group_by(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    extract(<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">year<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">, Appointment.start_datetime),  <\/span><span style=\"color: #7B7F8B\"># Agrupa por a\u00f1o<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    extract(<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">month<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">, Appointment.start_datetime)  <\/span><span style=\"color: #7B7F8B\"># Agrupa por mes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">).order_by(<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">year<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">month<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">)  <\/span><span style=\"color: #7B7F8B\"># Opcional: ordenar por a\u00f1o y mes<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">for<\/span><span style=\"color: #F6F6F4\"> row <\/span><span style=\"color: #F286C4\">in<\/span><span style=\"color: #F6F6F4\"> query.all():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #97E1F1\">print<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">f<\/span><span style=\"color: #E7EE98\">&#39;A\u00f1o: <\/span><span style=\"color: #BF9EEE\">{<\/span><span style=\"color: #F6F6F4\">row.year<\/span><span style=\"color: #BF9EEE\">}<\/span><span style=\"color: #E7EE98\">, Mes: <\/span><span style=\"color: #BF9EEE\">{<\/span><span style=\"color: #F6F6F4\">row.month<\/span><span style=\"color: #BF9EEE\">}<\/span><span style=\"color: #E7EE98\">, Citas: <\/span><span style=\"color: #BF9EEE\">{<\/span><span style=\"color: #F6F6F4\">row.appointments_count<\/span><span style=\"color: #BF9EEE\">}<\/span><span style=\"color: #E7EE98\">&#39;<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"10-filtrar-por-duracion-usando-interval\"><strong>10. Filtrar por Duraci\u00f3n Usando <code>Interval<\/code><\/strong><\/h3>\n\n\n<p>Si trabajas con campos de tipo <code>Interval<\/code>, puedes filtrar por duraciones espec\u00edficas:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"from datetime import timedelta\n# ...dem\u00e1s c\u00f3digo\n\nquery = session.query(Task).filter(\n    Task.duration &gt; timedelta(hours=2)  # Duraci\u00f3n mayor a 2 horas\n)\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> datetime <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> timedelta<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">query <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(Task).filter(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Task.duration <\/span><span style=\"color: #F286C4\">&gt;<\/span><span style=\"color: #F6F6F4\"> timedelta(<\/span><span style=\"color: #FFB86C; font-style: italic\">hours<\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #BF9EEE\">2<\/span><span style=\"color: #F6F6F4\">)  <\/span><span style=\"color: #7B7F8B\"># Duraci\u00f3n mayor a 2 horas<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"11-consultar-el-registro-mas-reciente-o-mas-antiguo\"><strong>11. Consultar el Registro M\u00e1s Reciente o M\u00e1s Antiguo<\/strong><\/h3>\n\n\n<p>Para obtener el registro con la fecha m\u00e1s reciente:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"query = session.query(Appointment).order_by(Appointment.start_datetime.desc()).first()\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F6F6F4\">query <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(Appointment).order_by(Appointment.start_datetime.desc()).first()<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Y para la fecha m\u00e1s antigua:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"query = session.query(Appointment).order_by(Appointment.start_datetime.asc()).first()\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F6F6F4\">query <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(Appointment).order_by(Appointment.start_datetime.asc()).first()<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"12-combinar-fechas-y-hora-en-consultas\"><strong>12. Combinar Fechas y Hora en Consultas<\/strong><\/h3>\n\n\n<p>Si solo tienes una fecha y necesitas incluir una hora espec\u00edfica para filtrado:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"from datetime import datetime\n# ...dem\u00e1s c\u00f3digo\n\nspecific_datetime = datetime(2024, 12, 25, 10, 0)  # 25 de diciembre a las 10:00 AM\n\nquery = session.query(Appointment).filter(\n    Appointment.start_datetime == specific_datetime\n)\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> datetime <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> datetime<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">specific_datetime <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> datetime(<\/span><span style=\"color: #BF9EEE\">2024<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">12<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">25<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">10<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">)  <\/span><span style=\"color: #7B7F8B\"># 25 de diciembre a las 10:00 AM<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">query <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(Appointment).filter(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Appointment.start_datetime <\/span><span style=\"color: #F286C4\">==<\/span><span style=\"color: #F6F6F4\"> specific_datetime<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"13-comparar-duraciones-entre-columnas\"><strong>13. Comparar Duraciones Entre Columnas<\/strong><\/h3>\n\n\n<p>Si tu modelo incluye varios campos de tipo <code>Interval<\/code> y necesitas compararlos:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"query = session.query(Task).filter(\n    Task.duration &gt; Task.estimated_duration\n)\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F6F6F4\">query <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(Task).filter(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Task.duration <\/span><span style=\"color: #F286C4\">&gt;<\/span><span style=\"color: #F6F6F4\"> Task.estimated_duration<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"14-consultar-fechas-relativas-usando-funciones-sql\"><strong>14. Consultar Fechas Relativas Usando Funciones SQL<\/strong><\/h3>\n\n\n<p>SQLAlchemy permite usar funciones nativas de SQL para c\u00e1lculos avanzados:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#282A36;font-style:italic;color:#f6f6f4\"><span style=\"border-bottom:1px solid rgba(251, 251, 239, 0.2)\">Python<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"from sqlalchemy import func\n# ...dem\u00e1s c\u00f3digo\n\nquery = session.query(Event).filter(\n    Event.event_date &gt; func.current_date()  # Eventos despu\u00e9s de hoy\n)\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">from<\/span><span style=\"color: #F6F6F4\"> sqlalchemy <\/span><span style=\"color: #F286C4\">import<\/span><span style=\"color: #F6F6F4\"> func<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\"># ...dem\u00e1s c\u00f3digo<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">query <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> session.query(Event).filter(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Event.event_date <\/span><span style=\"color: #F286C4\">&gt;<\/span><span style=\"color: #F6F6F4\"> func.current_date()  <\/span><span style=\"color: #7B7F8B\"># Eventos despu\u00e9s de hoy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"buenas-practicas-al-manejar-fechas-en-sqlalchemy\"><strong>Buenas Pr\u00e1cticas al Manejar Fechas en SQLAlchemy<\/strong><\/h2>\n\n\n<div style=\"height:16px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Almacena siempre las fechas en UTC.<\/strong> <br>Esto facilita la interoperabilidad en sistemas distribuidos y evita problemas de conversi\u00f3n de zonas horarias.<\/li>\n\n\n\n<li><strong>Valida las fechas antes de almacenarlas.<\/strong> <br>Usa middlewares o validaciones personalizadas para asegurarte de que las fechas cumplan las reglas de negocio.<\/li>\n\n\n\n<li><strong>Utiliza \u00edndices en columnas de fecha.<\/strong> <br>Si planeas realizar consultas frecuentes basadas en fechas, a\u00f1ade \u00edndices para optimizar el rendimiento.<\/li>\n\n\n\n<li><strong>Evita manejar l\u00f3gica de zonas horarias directamente en SQL.<\/strong> <br>Haz las conversiones necesarias en tu aplicaci\u00f3n para mantener la consistencia.<\/li>\n<\/ol>\n\n\n\n<p><\/p>\n\n\n\n<p>Si te interesa profundizar en este tema, aqu\u00ed en el blog puedes encontrar <a href=\"https:\/\/martafagundez.com\/codevolution\/buenas-practicas-en-la-gestion-de-fechas-al-desarrollar-una-api-restful\/\" target=\"_blank\" rel=\"noreferrer noopener\">este art\u00edculo sobre buenas pr\u00e1cticas en la gesti\u00f3n de fechas al desarrollar una API RESTful<\/a>. \ud83e\udd13<\/p>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusi\u00f3n<\/h2>\n\n\n<p>La gesti\u00f3n de fechas en SQLAlchemy es una habilidad crucial para desarrolladores web. <\/p>\n\n\n\n<p>Al comprender los tipos de datos, m\u00e9todos de consulta y mejores pr\u00e1cticas, puedes garantizar que tus aplicaciones manejen fechas y horas de manera <strong>precisa y eficiente<\/strong>.<\/p>\n\n\n\n<p>Ya sea que est\u00e9s desarrollando una API de citas o un sistema de auditor\u00eda, SQLAlchemy ofrece las herramientas necesarias para trabajar con datos temporales de forma <strong>robusta y escalable<\/strong>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La gesti\u00f3n de fechas y horas es un aspecto fundamental en el desarrollo de aplicaciones modernas, especialmente en sistemas que dependen de la sincronizaci\u00f3n, registro&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[39,42,52,53],"tags":[35],"class_list":["post-1711","post","type-post","status-publish","format-standard","hentry","category-backend","category-desarrollo-web","category-python","category-sqlalchemy","tag-back-end"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Gesti\u00f3n de Fechas en SQLAlchemy - CODEvolution<\/title>\n<meta name=\"description\" content=\"Aprende c\u00f3mo manejar eficientemente fechas y horas en SQLAlchemy. Descubre tipos de datos, consultas avanzadas y mejores pr\u00e1cticas.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gesti\u00f3n de Fechas en SQLAlchemy - CODEvolution\" \/>\n<meta property=\"og:description\" content=\"Aprende c\u00f3mo manejar eficientemente fechas y horas en SQLAlchemy. Descubre tipos de datos, consultas avanzadas y mejores pr\u00e1cticas.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/\" \/>\n<meta property=\"og:site_name\" content=\"CODEvolution\" \/>\n<meta property=\"article:published_time\" content=\"2024-12-05T23:12:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-04-18T03:32:50+00:00\" \/>\n<meta name=\"author\" content=\"Marta Fag\u00fandez\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Marta Fag\u00fandez\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/\"},\"author\":{\"name\":\"Marta Fag\u00fandez\",\"@id\":\"https:\/\/martafagundez.com\/codevolution\/#\/schema\/person\/3e1e66d60048c83d5dff039f53b615e1\"},\"headline\":\"Gesti\u00f3n de Fechas en SQLAlchemy\",\"datePublished\":\"2024-12-05T23:12:48+00:00\",\"dateModified\":\"2025-04-18T03:32:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/\"},\"wordCount\":931,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/martafagundez.com\/codevolution\/#\/schema\/person\/3e1e66d60048c83d5dff039f53b615e1\"},\"keywords\":[\"Back End\"],\"articleSection\":[\"Back End\",\"Desarrollo Web\",\"Python\",\"SQLAlchemy\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/\",\"url\":\"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/\",\"name\":\"Gesti\u00f3n de Fechas en SQLAlchemy - CODEvolution\",\"isPartOf\":{\"@id\":\"https:\/\/martafagundez.com\/codevolution\/#website\"},\"datePublished\":\"2024-12-05T23:12:48+00:00\",\"dateModified\":\"2025-04-18T03:32:50+00:00\",\"description\":\"Aprende c\u00f3mo manejar eficientemente fechas y horas en SQLAlchemy. Descubre tipos de datos, consultas avanzadas y mejores pr\u00e1cticas.\",\"breadcrumb\":{\"@id\":\"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\/\/martafagundez.com\/codevolution\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Gesti\u00f3n de Fechas en SQLAlchemy\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/martafagundez.com\/codevolution\/#website\",\"url\":\"https:\/\/martafagundez.com\/codevolution\/\",\"name\":\"CODEvolution\",\"description\":\"Blog de Marta Fag\u00fandez\",\"publisher\":{\"@id\":\"https:\/\/martafagundez.com\/codevolution\/#\/schema\/person\/3e1e66d60048c83d5dff039f53b615e1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/martafagundez.com\/codevolution\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/martafagundez.com\/codevolution\/#\/schema\/person\/3e1e66d60048c83d5dff039f53b615e1\",\"name\":\"Marta Fag\u00fandez\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/martafagundez.com\/codevolution\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/martafagundez.com\/codevolution\/wp-content\/uploads\/2023\/08\/marta_fagundez_developer_avatar1.png\",\"contentUrl\":\"https:\/\/martafagundez.com\/codevolution\/wp-content\/uploads\/2023\/08\/marta_fagundez_developer_avatar1.png\",\"width\":603,\"height\":603,\"caption\":\"Marta Fag\u00fandez\"},\"logo\":{\"@id\":\"https:\/\/martafagundez.com\/codevolution\/#\/schema\/person\/image\/\"},\"description\":\"Aqu\u00ed comparto algunos de mis aprendizajes como desarrolladora web. Si alguno de mis art\u00edculos te ha resultado \u00fatil, me alegrar\u00eda saberlo ;)\",\"sameAs\":[\"https:\/\/martafagundez.com\",\"https:\/\/www.linkedin.com\/in\/martafagundezrodriguez\",\"https:\/\/www.youtube.com\/@martafagundez\"],\"url\":\"https:\/\/martafagundez.com\/codevolution\/author\/marta\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Gesti\u00f3n de Fechas en SQLAlchemy - CODEvolution","description":"Aprende c\u00f3mo manejar eficientemente fechas y horas en SQLAlchemy. Descubre tipos de datos, consultas avanzadas y mejores pr\u00e1cticas.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/","og_locale":"es_ES","og_type":"article","og_title":"Gesti\u00f3n de Fechas en SQLAlchemy - CODEvolution","og_description":"Aprende c\u00f3mo manejar eficientemente fechas y horas en SQLAlchemy. Descubre tipos de datos, consultas avanzadas y mejores pr\u00e1cticas.","og_url":"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/","og_site_name":"CODEvolution","article_published_time":"2024-12-05T23:12:48+00:00","article_modified_time":"2025-04-18T03:32:50+00:00","author":"Marta Fag\u00fandez","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Marta Fag\u00fandez","Tiempo de lectura":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/#article","isPartOf":{"@id":"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/"},"author":{"name":"Marta Fag\u00fandez","@id":"https:\/\/martafagundez.com\/codevolution\/#\/schema\/person\/3e1e66d60048c83d5dff039f53b615e1"},"headline":"Gesti\u00f3n de Fechas en SQLAlchemy","datePublished":"2024-12-05T23:12:48+00:00","dateModified":"2025-04-18T03:32:50+00:00","mainEntityOfPage":{"@id":"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/"},"wordCount":931,"commentCount":0,"publisher":{"@id":"https:\/\/martafagundez.com\/codevolution\/#\/schema\/person\/3e1e66d60048c83d5dff039f53b615e1"},"keywords":["Back End"],"articleSection":["Back End","Desarrollo Web","Python","SQLAlchemy"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/","url":"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/","name":"Gesti\u00f3n de Fechas en SQLAlchemy - CODEvolution","isPartOf":{"@id":"https:\/\/martafagundez.com\/codevolution\/#website"},"datePublished":"2024-12-05T23:12:48+00:00","dateModified":"2025-04-18T03:32:50+00:00","description":"Aprende c\u00f3mo manejar eficientemente fechas y horas en SQLAlchemy. Descubre tipos de datos, consultas avanzadas y mejores pr\u00e1cticas.","breadcrumb":{"@id":"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/martafagundez.com\/codevolution\/gestion-de-fechas-en-sqlalchemy\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/martafagundez.com\/codevolution\/"},{"@type":"ListItem","position":2,"name":"Gesti\u00f3n de Fechas en SQLAlchemy"}]},{"@type":"WebSite","@id":"https:\/\/martafagundez.com\/codevolution\/#website","url":"https:\/\/martafagundez.com\/codevolution\/","name":"CODEvolution","description":"Blog de Marta Fag\u00fandez","publisher":{"@id":"https:\/\/martafagundez.com\/codevolution\/#\/schema\/person\/3e1e66d60048c83d5dff039f53b615e1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/martafagundez.com\/codevolution\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":["Person","Organization"],"@id":"https:\/\/martafagundez.com\/codevolution\/#\/schema\/person\/3e1e66d60048c83d5dff039f53b615e1","name":"Marta Fag\u00fandez","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/martafagundez.com\/codevolution\/#\/schema\/person\/image\/","url":"https:\/\/martafagundez.com\/codevolution\/wp-content\/uploads\/2023\/08\/marta_fagundez_developer_avatar1.png","contentUrl":"https:\/\/martafagundez.com\/codevolution\/wp-content\/uploads\/2023\/08\/marta_fagundez_developer_avatar1.png","width":603,"height":603,"caption":"Marta Fag\u00fandez"},"logo":{"@id":"https:\/\/martafagundez.com\/codevolution\/#\/schema\/person\/image\/"},"description":"Aqu\u00ed comparto algunos de mis aprendizajes como desarrolladora web. Si alguno de mis art\u00edculos te ha resultado \u00fatil, me alegrar\u00eda saberlo ;)","sameAs":["https:\/\/martafagundez.com","https:\/\/www.linkedin.com\/in\/martafagundezrodriguez","https:\/\/www.youtube.com\/@martafagundez"],"url":"https:\/\/martafagundez.com\/codevolution\/author\/marta\/"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/martafagundez.com\/codevolution\/wp-json\/wp\/v2\/posts\/1711","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/martafagundez.com\/codevolution\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/martafagundez.com\/codevolution\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/martafagundez.com\/codevolution\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/martafagundez.com\/codevolution\/wp-json\/wp\/v2\/comments?post=1711"}],"version-history":[{"count":30,"href":"https:\/\/martafagundez.com\/codevolution\/wp-json\/wp\/v2\/posts\/1711\/revisions"}],"predecessor-version":[{"id":1763,"href":"https:\/\/martafagundez.com\/codevolution\/wp-json\/wp\/v2\/posts\/1711\/revisions\/1763"}],"wp:attachment":[{"href":"https:\/\/martafagundez.com\/codevolution\/wp-json\/wp\/v2\/media?parent=1711"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/martafagundez.com\/codevolution\/wp-json\/wp\/v2\/categories?post=1711"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/martafagundez.com\/codevolution\/wp-json\/wp\/v2\/tags?post=1711"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}