[{"data":1,"prerenderedAt":494},["ShallowReactive",2],{"\u002Fv5\u002Fdodock\u002Fdeveloppeurs\u002Fapi\u002Fquery-builder\u002Ffonctions-date":3,"section:\u002Fv5\u002Fdodock\u002Fdeveloppeurs\u002Fapi\u002Fquery-builder\u002Ffonctions-date":493},{"id":4,"title":5,"body":6,"description":481,"extension":482,"meta":483,"navigation":341,"path":489,"seo":490,"stem":491,"__hash__":492},"docs\u002F1.v5\u002F3.dodock\u002F10.developpeurs\u002F1.api\u002F5.query-builder\u002F4.fonctions-date.md","Fonctions de date dans le Query Builder",{"type":7,"value":8,"toc":471},"minimark",[9,13,37,40,45,126,146,152,169,234,245,250,253,300,306,317,413,417,453,467],[10,11,5],"h1",{"id":12},"fonctions-de-date-dans-le-query-builder",[14,15,16,17,21,22,25,26,29,30,25,33,36],"p",{},"Les fonctions ",[18,19,20],"code",{},"MONTH",", ",[18,23,24],{},"QUARTER"," et ",[18,27,28],{},"MONTHNAME"," extraient le mois, le trimestre ou le nom du mois d'un champ date. Utilisez-les dans ",[18,31,32],{},"frappe.get_list",[18,34,35],{},"frappe.get_all"," pour grouper des enregistrements par période, sans SQL brut.",[14,38,39],{},"Elles fonctionnent sur MariaDB et PostgreSQL. Dodock produit le SQL adapté à la base du site.",[41,42,44],"h2",{"id":43},"fonctions-disponibles","Fonctions disponibles",[46,47,48,64],"table",{},[49,50,51],"thead",{},[52,53,54,58,61],"tr",{},[55,56,57],"th",{},"Fonction",[55,59,60],{},"Classe Python",[55,62,63],{},"Résultat",[65,66,67,90,109],"tbody",{},[52,68,69,74,79],{},[70,71,72],"td",{},[18,73,20],{},[70,75,76],{},[18,77,78],{},"Month",[70,80,81,82,85,86,89],{},"Mois, de ",[18,83,84],{},"1"," à ",[18,87,88],{},"12"," (nombre entier)",[52,91,92,96,101],{},[70,93,94],{},[18,95,24],{},[70,97,98],{},[18,99,100],{},"Quarter",[70,102,103,104,85,106,89],{},"Trimestre, de ",[18,105,84],{},[18,107,108],{},"4",[52,110,111,115,120],{},[70,112,113],{},[18,114,28],{},[70,116,117],{},[18,118,119],{},"MonthName",[70,121,122,123],{},"Nom du mois en anglais, par exemple ",[18,124,125],{},"November",[127,128,131],"callout",{"color":129,"icon":130},"amber","i-heroicons-exclamation-triangle",[14,132,133,134,137,138,141,142,145],{},"En v5, ",[18,135,136],{},"YEAR"," n'est pas encore accepté dans ",[18,139,140],{},"fields",". Son ajout, déjà présent dans Frappe v16, est prévu dans une prochaine mise à jour de la v5. En attendant, pour grouper par année, écrivez la requête avec ",[18,143,144],{},"frappe.qb"," (voir plus bas).",[41,147,149,150],{"id":148},"syntaxe-dans-fields","Syntaxe dans ",[18,151,140],{},[14,153,154,155,157,158,161,162,25,165,168],{},"Passez un dictionnaire dans ",[18,156,140],{}," : la clé est le nom de la fonction, la valeur est le champ. La clé ",[18,159,160],{},"as"," donne un alias à la colonne. Utilisez cet alias dans ",[18,163,164],{},"group_by",[18,166,167],{},"order_by",".",[170,171,176],"pre",{"className":172,"code":173,"language":174,"meta":175,"style":175},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","frappe.get_list(\n    \"Sales Order\",\n    fields=[\n        {\"MONTH\": \"transaction_date\", \"as\": \"mois\"},\n        {\"COUNT\": \"*\", \"as\": \"nb_commandes\"},\n    ],\n    filters={\"docstatus\": 1},\n    group_by=\"mois\",\n)\n","python","",[18,177,178,186,192,198,204,210,216,222,228],{"__ignoreMap":175},[179,180,183],"span",{"class":181,"line":182},"line",1,[179,184,185],{},"frappe.get_list(\n",[179,187,189],{"class":181,"line":188},2,[179,190,191],{},"    \"Sales Order\",\n",[179,193,195],{"class":181,"line":194},3,[179,196,197],{},"    fields=[\n",[179,199,201],{"class":181,"line":200},4,[179,202,203],{},"        {\"MONTH\": \"transaction_date\", \"as\": \"mois\"},\n",[179,205,207],{"class":181,"line":206},5,[179,208,209],{},"        {\"COUNT\": \"*\", \"as\": \"nb_commandes\"},\n",[179,211,213],{"class":181,"line":212},6,[179,214,215],{},"    ],\n",[179,217,219],{"class":181,"line":218},7,[179,220,221],{},"    filters={\"docstatus\": 1},\n",[179,223,225],{"class":181,"line":224},8,[179,226,227],{},"    group_by=\"mois\",\n",[179,229,231],{"class":181,"line":230},9,[179,232,233],{},")\n",[14,235,236,237,240,241,244],{},"Dodock refuse les fonctions SQL écrites en texte, comme ",[18,238,239],{},"\"MONTH(creation)\""," ou ",[18,242,243],{},"\"count(*) as total\"",". Utilisez toujours la syntaxe dictionnaire.",[246,247,249],"h3",{"id":248},"grouper-des-achats-par-trimestre","Grouper des achats par trimestre",[14,251,252],{},"Le nom du fournisseur est fictif.",[170,254,256],{"className":172,"code":255,"language":174,"meta":175,"style":175},"resultats = frappe.get_list(\n    \"Purchase Invoice\",\n    fields=[\n        {\"QUARTER\": \"posting_date\", \"as\": \"trimestre\"},\n        {\"SUM\": \"grand_total\", \"as\": \"total_achats\"},\n    ],\n    filters={\"supplier\": \"Bureau Moderne\", \"docstatus\": 1},\n    group_by=\"trimestre\",\n)\n",[18,257,258,263,268,272,277,282,286,291,296],{"__ignoreMap":175},[179,259,260],{"class":181,"line":182},[179,261,262],{},"resultats = frappe.get_list(\n",[179,264,265],{"class":181,"line":188},[179,266,267],{},"    \"Purchase Invoice\",\n",[179,269,270],{"class":181,"line":194},[179,271,197],{},[179,273,274],{"class":181,"line":200},[179,275,276],{},"        {\"QUARTER\": \"posting_date\", \"as\": \"trimestre\"},\n",[179,278,279],{"class":181,"line":206},[179,280,281],{},"        {\"SUM\": \"grand_total\", \"as\": \"total_achats\"},\n",[179,283,284],{"class":181,"line":212},[179,285,215],{},[179,287,288],{"class":181,"line":218},[179,289,290],{},"    filters={\"supplier\": \"Bureau Moderne\", \"docstatus\": 1},\n",[179,292,293],{"class":181,"line":224},[179,294,295],{},"    group_by=\"trimestre\",\n",[179,297,298],{"class":181,"line":230},[179,299,233],{},[41,301,303,304],{"id":302},"grouper-par-année-avec-frappeqb","Grouper par année avec ",[18,305,144],{},[14,307,308,309,312,313,316],{},"Le module ",[18,310,311],{},"frappe.query_builder.custom"," contient aussi une classe ",[18,314,315],{},"Year",", utilisable avec le Query Builder :",[170,318,320],{"className":172,"code":319,"language":174,"meta":175,"style":175},"import frappe\nfrom frappe.query_builder.custom import Year\nfrom frappe.query_builder.functions import Count\n\nSalesInvoice = frappe.qb.DocType(\"Sales Invoice\")\n\nquery = (\n    frappe.qb.from_(SalesInvoice)\n    .select(\n        Year(SalesInvoice.posting_date).as_(\"annee\"),\n        Count(\"*\").as_(\"nb\"),\n    )\n    .where(SalesInvoice.docstatus == 1)\n    .groupby(Year(SalesInvoice.posting_date))\n)\n\nresultats = query.run(as_dict=True)\n",[18,321,322,327,332,337,343,348,352,357,362,367,373,379,385,391,397,402,407],{"__ignoreMap":175},[179,323,324],{"class":181,"line":182},[179,325,326],{},"import frappe\n",[179,328,329],{"class":181,"line":188},[179,330,331],{},"from frappe.query_builder.custom import Year\n",[179,333,334],{"class":181,"line":194},[179,335,336],{},"from frappe.query_builder.functions import Count\n",[179,338,339],{"class":181,"line":200},[179,340,342],{"emptyLinePlaceholder":341},true,"\n",[179,344,345],{"class":181,"line":206},[179,346,347],{},"SalesInvoice = frappe.qb.DocType(\"Sales Invoice\")\n",[179,349,350],{"class":181,"line":212},[179,351,342],{"emptyLinePlaceholder":341},[179,353,354],{"class":181,"line":218},[179,355,356],{},"query = (\n",[179,358,359],{"class":181,"line":224},[179,360,361],{},"    frappe.qb.from_(SalesInvoice)\n",[179,363,364],{"class":181,"line":230},[179,365,366],{},"    .select(\n",[179,368,370],{"class":181,"line":369},10,[179,371,372],{},"        Year(SalesInvoice.posting_date).as_(\"annee\"),\n",[179,374,376],{"class":181,"line":375},11,[179,377,378],{},"        Count(\"*\").as_(\"nb\"),\n",[179,380,382],{"class":181,"line":381},12,[179,383,384],{},"    )\n",[179,386,388],{"class":181,"line":387},13,[179,389,390],{},"    .where(SalesInvoice.docstatus == 1)\n",[179,392,394],{"class":181,"line":393},14,[179,395,396],{},"    .groupby(Year(SalesInvoice.posting_date))\n",[179,398,400],{"class":181,"line":399},15,[179,401,233],{},[179,403,405],{"class":181,"line":404},16,[179,406,342],{"emptyLinePlaceholder":341},[179,408,410],{"class":181,"line":409},17,[179,411,412],{},"resultats = query.run(as_dict=True)\n",[41,414,416],{"id":415},"sql-produit","SQL produit",[46,418,419,432],{},[49,420,421],{},[52,422,423,426],{},[55,424,425],{},"Base",[55,427,428,431],{},[18,429,430],{},"MONTH(posting_date)"," devient",[65,433,434,443],{},[52,435,436,439],{},[70,437,438],{},"MariaDB",[70,440,441],{},[18,442,430],{},[52,444,445,448],{},[70,446,447],{},"PostgreSQL",[70,449,450],{},[18,451,452],{},"CAST(date_part('month', posting_date) AS INTEGER)",[14,454,455,456,458,459,462,463,466],{},"La liste des fonctions acceptées dans ",[18,457,140],{}," est le dictionnaire ",[18,460,461],{},"FUNCTION_MAPPING"," de ",[18,464,465],{},"frappe\u002Fdatabase\u002Fquery.py",". Une application ne peut pas y ajouter de fonction.",[468,469,470],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":175,"searchDepth":182,"depth":188,"links":472},[473,474,478,480],{"id":43,"depth":188,"text":44},{"id":148,"depth":188,"text":475,"children":476},"Syntaxe dans fields",[477],{"id":248,"depth":194,"text":249},{"id":302,"depth":188,"text":479},"Grouper par année avec frappe.qb",{"id":415,"depth":188,"text":416},"Utilisez les fonctions de date MONTH, QUARTER et MONTHNAME dans frappe.get_list et frappe.get_all pour grouper ou filtrer vos données par période.","md",{"reviewed":341,"last_verified":484,"sources":485},"2026-11-04",[486,487,488],"dodock@v5-dev:frappe\u002Fdatabase\u002Fquery.py","dodock@v5-dev:frappe\u002Fquery_builder\u002Fcustom.py","dodock@v5-dev:frappe\u002Fquery_builder\u002Ffunctions.py","\u002Fv5\u002Fdodock\u002Fdeveloppeurs\u002Fapi\u002Fquery-builder\u002Ffonctions-date",{"title":5,"description":481},"1.v5\u002F3.dodock\u002F10.developpeurs\u002F1.api\u002F5.query-builder\u002F4.fonctions-date","qDzWmRqCHNaXI0W2bP1lYnAshQlgVbVKICPA_92KThs",{},1794522726986]