[{"data":1,"prerenderedAt":628},["ShallowReactive",2],{"\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fapi\u002Fquery-builder\u002Ffonctions-date":3,"section:\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fapi\u002Fquery-builder\u002Ffonctions-date":627},{"id":4,"title":5,"body":6,"description":614,"extension":615,"meta":616,"navigation":256,"path":623,"seo":624,"stem":625,"__hash__":626},"docs\u002F2.next\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":601},"minimark",[9,13,37,40,45,143,150,167,208,230,234,237,242,337,341,387,391,437,444,451,531,535,581,597],[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",{},"YEAR",", ",[18,23,24],{},"MONTH"," et ",[18,27,28],{},"QUARTER"," extraient l'année, le mois ou le trimestre 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, PostgreSQL et SQLite. Dodock produit le SQL adapté à la base du site. Le résultat est toujours un nombre entier.",[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,85,106,125],"tbody",{},[52,68,69,74,79],{},[70,71,72],"td",{},[18,73,20],{},[70,75,76],{},[18,77,78],{},"Year",[70,80,81,82],{},"Année, par exemple ",[18,83,84],{},"2026",[52,86,87,91,96],{},[70,88,89],{},[18,90,24],{},[70,92,93],{},[18,94,95],{},"Month",[70,97,98,99,102,103],{},"Mois, de ",[18,100,101],{},"1"," à ",[18,104,105],{},"12",[52,107,108,112,117],{},[70,109,110],{},[18,111,28],{},[70,113,114],{},[18,115,116],{},"Quarter",[70,118,119,120,102,122],{},"Trimestre, de ",[18,121,101],{},[18,123,124],{},"4",[52,126,127,132,137],{},[70,128,129],{},[18,130,131],{},"MONTHNAME",[70,133,134],{},[18,135,136],{},"MonthName",[70,138,139,140],{},"Nom du mois en anglais, par exemple ",[18,141,142],{},"November",[41,144,146,147],{"id":145},"syntaxe-dans-fields","Syntaxe dans ",[18,148,149],{},"fields",[14,151,152,153,155,156,159,160,25,163,166],{},"Passez un dictionnaire dans ",[18,154,149],{}," : la clé est le nom de la fonction, la valeur est le champ. La clé ",[18,157,158],{},"as"," donne un alias à la colonne. Utilisez cet alias dans ",[18,161,162],{},"group_by",[18,164,165],{},"order_by",".",[168,169,174],"pre",{"className":170,"code":171,"language":172,"meta":173,"style":173},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","frappe.get_list(\n    \"User\",\n    fields=[{\"YEAR\": \"creation\", \"as\": \"creation_year\"}],\n    group_by=\"creation_year\",\n)\n","python","",[18,175,176,184,190,196,202],{"__ignoreMap":173},[177,178,181],"span",{"class":179,"line":180},"line",1,[177,182,183],{},"frappe.get_list(\n",[177,185,187],{"class":179,"line":186},2,[177,188,189],{},"    \"User\",\n",[177,191,193],{"class":179,"line":192},3,[177,194,195],{},"    fields=[{\"YEAR\": \"creation\", \"as\": \"creation_year\"}],\n",[177,197,199],{"class":179,"line":198},4,[177,200,201],{},"    group_by=\"creation_year\",\n",[177,203,205],{"class":179,"line":204},5,[177,206,207],{},")\n",[209,210,213],"callout",{"color":211,"icon":212},"amber","i-heroicons-exclamation-triangle",[14,214,215,216,219,220,223,224,226,227,229],{},"Dodock refuse les fonctions SQL écrites en texte, comme ",[18,217,218],{},"\"YEAR(creation)\""," ou ",[18,221,222],{},"\"count(*) as total\"",". Utilisez toujours la syntaxe dictionnaire, dans ",[18,225,149],{}," comme dans ",[18,228,162],{}," (par l'alias).",[41,231,233],{"id":232},"exemples","Exemples",[14,235,236],{},"Les noms de clients et de fournisseurs sont fictifs.",[238,239,241],"h3",{"id":240},"grouper-des-factures-par-année","Grouper des factures par année",[168,243,245],{"className":170,"code":244,"language":172,"meta":173,"style":173},"import frappe\n\nresultats = frappe.get_list(\n    \"Sales Invoice\",\n    fields=[\n        {\"YEAR\": \"posting_date\", \"as\": \"annee\"},\n        {\"COUNT\": \"*\", \"as\": \"total_factures\"},\n        {\"SUM\": \"grand_total\", \"as\": \"chiffre_affaires\"},\n    ],\n    filters={\"docstatus\": 1},\n    group_by=\"annee\",\n    order_by=\"annee asc\",\n)\n\nfor ligne in resultats:\n    print(f\"Année {ligne.annee} : {ligne.total_factures} factures, {ligne.chiffre_affaires} €\")\n",[18,246,247,252,258,263,268,273,279,285,291,297,303,309,315,320,325,331],{"__ignoreMap":173},[177,248,249],{"class":179,"line":180},[177,250,251],{},"import frappe\n",[177,253,254],{"class":179,"line":186},[177,255,257],{"emptyLinePlaceholder":256},true,"\n",[177,259,260],{"class":179,"line":192},[177,261,262],{},"resultats = frappe.get_list(\n",[177,264,265],{"class":179,"line":198},[177,266,267],{},"    \"Sales Invoice\",\n",[177,269,270],{"class":179,"line":204},[177,271,272],{},"    fields=[\n",[177,274,276],{"class":179,"line":275},6,[177,277,278],{},"        {\"YEAR\": \"posting_date\", \"as\": \"annee\"},\n",[177,280,282],{"class":179,"line":281},7,[177,283,284],{},"        {\"COUNT\": \"*\", \"as\": \"total_factures\"},\n",[177,286,288],{"class":179,"line":287},8,[177,289,290],{},"        {\"SUM\": \"grand_total\", \"as\": \"chiffre_affaires\"},\n",[177,292,294],{"class":179,"line":293},9,[177,295,296],{},"    ],\n",[177,298,300],{"class":179,"line":299},10,[177,301,302],{},"    filters={\"docstatus\": 1},\n",[177,304,306],{"class":179,"line":305},11,[177,307,308],{},"    group_by=\"annee\",\n",[177,310,312],{"class":179,"line":311},12,[177,313,314],{},"    order_by=\"annee asc\",\n",[177,316,318],{"class":179,"line":317},13,[177,319,207],{},[177,321,323],{"class":179,"line":322},14,[177,324,257],{"emptyLinePlaceholder":256},[177,326,328],{"class":179,"line":327},15,[177,329,330],{},"for ligne in resultats:\n",[177,332,334],{"class":179,"line":333},16,[177,335,336],{},"    print(f\"Année {ligne.annee} : {ligne.total_factures} factures, {ligne.chiffre_affaires} €\")\n",[238,338,340],{"id":339},"grouper-des-commandes-par-mois","Grouper des commandes par mois",[168,342,344],{"className":170,"code":343,"language":172,"meta":173,"style":173},"resultats = frappe.get_list(\n    \"Sales Order\",\n    fields=[\n        {\"MONTH\": \"transaction_date\", \"as\": \"mois\"},\n        {\"COUNT\": \"*\", \"as\": \"nb_commandes\"},\n    ],\n    filters={\"docstatus\": 1, \"customer\": \"Maison Verte SARL\"},\n    group_by=\"mois\",\n)\n",[18,345,346,350,355,359,364,369,373,378,383],{"__ignoreMap":173},[177,347,348],{"class":179,"line":180},[177,349,262],{},[177,351,352],{"class":179,"line":186},[177,353,354],{},"    \"Sales Order\",\n",[177,356,357],{"class":179,"line":192},[177,358,272],{},[177,360,361],{"class":179,"line":198},[177,362,363],{},"        {\"MONTH\": \"transaction_date\", \"as\": \"mois\"},\n",[177,365,366],{"class":179,"line":204},[177,367,368],{},"        {\"COUNT\": \"*\", \"as\": \"nb_commandes\"},\n",[177,370,371],{"class":179,"line":275},[177,372,296],{},[177,374,375],{"class":179,"line":281},[177,376,377],{},"    filters={\"docstatus\": 1, \"customer\": \"Maison Verte SARL\"},\n",[177,379,380],{"class":179,"line":287},[177,381,382],{},"    group_by=\"mois\",\n",[177,384,385],{"class":179,"line":293},[177,386,207],{},[238,388,390],{"id":389},"grouper-des-achats-par-trimestre","Grouper des achats par trimestre",[168,392,394],{"className":170,"code":393,"language":172,"meta":173,"style":173},"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,395,396,400,405,409,414,419,423,428,433],{"__ignoreMap":173},[177,397,398],{"class":179,"line":180},[177,399,262],{},[177,401,402],{"class":179,"line":186},[177,403,404],{},"    \"Purchase Invoice\",\n",[177,406,407],{"class":179,"line":192},[177,408,272],{},[177,410,411],{"class":179,"line":198},[177,412,413],{},"        {\"QUARTER\": \"posting_date\", \"as\": \"trimestre\"},\n",[177,415,416],{"class":179,"line":204},[177,417,418],{},"        {\"SUM\": \"grand_total\", \"as\": \"total_achats\"},\n",[177,420,421],{"class":179,"line":275},[177,422,296],{},[177,424,425],{"class":179,"line":281},[177,426,427],{},"    filters={\"supplier\": \"Bureau Moderne\", \"docstatus\": 1},\n",[177,429,430],{"class":179,"line":287},[177,431,432],{},"    group_by=\"trimestre\",\n",[177,434,435],{"class":179,"line":293},[177,436,207],{},[41,438,440,441],{"id":439},"utiliser-les-classes-avec-frappeqb","Utiliser les classes avec ",[18,442,443],{},"frappe.qb",[14,445,446,447,450],{},"Avec le Query Builder, importez les classes depuis ",[18,448,449],{},"frappe.query_builder.functions"," :",[168,452,454],{"className":170,"code":453,"language":172,"meta":173,"style":173},"import frappe\nfrom frappe.query_builder.functions import Count, Year\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,455,456,460,465,469,474,478,483,488,493,498,503,508,513,518,522,526],{"__ignoreMap":173},[177,457,458],{"class":179,"line":180},[177,459,251],{},[177,461,462],{"class":179,"line":186},[177,463,464],{},"from frappe.query_builder.functions import Count, Year\n",[177,466,467],{"class":179,"line":192},[177,468,257],{"emptyLinePlaceholder":256},[177,470,471],{"class":179,"line":198},[177,472,473],{},"SalesInvoice = frappe.qb.DocType(\"Sales Invoice\")\n",[177,475,476],{"class":179,"line":204},[177,477,257],{"emptyLinePlaceholder":256},[177,479,480],{"class":179,"line":275},[177,481,482],{},"query = (\n",[177,484,485],{"class":179,"line":281},[177,486,487],{},"    frappe.qb.from_(SalesInvoice)\n",[177,489,490],{"class":179,"line":287},[177,491,492],{},"    .select(\n",[177,494,495],{"class":179,"line":293},[177,496,497],{},"        Year(SalesInvoice.posting_date).as_(\"annee\"),\n",[177,499,500],{"class":179,"line":299},[177,501,502],{},"        Count(\"*\").as_(\"nb\"),\n",[177,504,505],{"class":179,"line":305},[177,506,507],{},"    )\n",[177,509,510],{"class":179,"line":311},[177,511,512],{},"    .where(SalesInvoice.docstatus == 1)\n",[177,514,515],{"class":179,"line":317},[177,516,517],{},"    .groupby(Year(SalesInvoice.posting_date))\n",[177,519,520],{"class":179,"line":322},[177,521,207],{},[177,523,524],{"class":179,"line":327},[177,525,257],{"emptyLinePlaceholder":256},[177,527,528],{"class":179,"line":333},[177,529,530],{},"resultats = query.run(as_dict=True)\n",[41,532,534],{"id":533},"sql-produit","SQL produit",[46,536,537,550],{},[49,538,539],{},[52,540,541,544],{},[55,542,543],{},"Base",[55,545,546,549],{},[18,547,548],{},"YEAR(posting_date)"," devient",[65,551,552,561,571],{},[52,553,554,557],{},[70,555,556],{},"MariaDB",[70,558,559],{},[18,560,548],{},[52,562,563,566],{},[70,564,565],{},"PostgreSQL",[70,567,568],{},[18,569,570],{},"CAST(date_part('year', posting_date) AS INTEGER)",[52,572,573,576],{},[70,574,575],{},"SQLite",[70,577,578],{},[18,579,580],{},"CAST(STRFTIME('%Y', posting_date) AS INTEGER)",[14,582,583,584,586,587,590,591,594,595,166],{},"La liste des fonctions acceptées dans ",[18,585,149],{}," est le dictionnaire ",[18,588,589],{},"FUNCTION_MAPPING"," de ",[18,592,593],{},"frappe\u002Fdatabase\u002Fquery.py",". Une application ne peut pas y ajouter de fonction. Pour une autre fonction de date, comme le jour de la semaine, écrivez la requête avec ",[18,596,443],{},[598,599,600],"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":173,"searchDepth":180,"depth":186,"links":602},[603,604,606,611,613],{"id":43,"depth":186,"text":44},{"id":145,"depth":186,"text":605},"Syntaxe dans fields",{"id":232,"depth":186,"text":233,"children":607},[608,609,610],{"id":240,"depth":192,"text":241},{"id":339,"depth":192,"text":340},{"id":389,"depth":192,"text":390},{"id":439,"depth":186,"text":612},"Utiliser les classes avec frappe.qb",{"id":533,"depth":186,"text":534},"Utilisez les fonctions de date (YEAR, MONTH, QUARTER) dans frappe.get_list et frappe.get_all pour grouper ou filtrer vos données par période.","md",{"reviewed":256,"last_verified":617,"sources":618},"2026-11-03",[619,620,621,622],"dodock@develop:frappe\u002Fdatabase\u002Fquery.py","dodock@develop:frappe\u002Fquery_builder\u002Fcustom.py","dodock@develop:frappe\u002Fquery_builder\u002Ffunctions.py","dodock@develop:frappe\u002Ftests\u002Ftest_query.py","\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fapi\u002Fquery-builder\u002Ffonctions-date",{"title":5,"description":614},"2.next\u002F3.dodock\u002F10.developpeurs\u002F1.api\u002F5.query-builder\u002F4.fonctions-date","iyTm3f0VfvdkxXUG9_S-X1eaJmslD0JP2sZOVze3HPc",{},1793871732315]