APIv4 - Add MONTH sql function
authorColeman Watts <coleman@civicrm.org>
Thu, 5 May 2022 13:09:27 +0000 (09:09 -0400)
committerColeman Watts <coleman@civicrm.org>
Thu, 5 May 2022 13:11:22 +0000 (09:11 -0400)
Civi/Api4/Query/SqlFunctionMONTH.php [new file with mode: 0644]
tests/phpunit/api/v4/Action/SqlFunctionTest.php

diff --git a/Civi/Api4/Query/SqlFunctionMONTH.php b/Civi/Api4/Query/SqlFunctionMONTH.php
new file mode 100644 (file)
index 0000000..4f90334
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+namespace Civi\Api4\Query;
+
+/**
+ * Sql function
+ */
+class SqlFunctionMONTH extends SqlFunction {
+
+  protected static $category = self::CATEGORY_DATE;
+
+  protected static $dataType = 'Integer';
+
+  protected static function params(): array {
+    return [
+      [
+        'max_expr' => 1,
+        'optional' => FALSE,
+      ],
+    ];
+  }
+
+  /**
+   * @return string
+   */
+  public static function getTitle(): string {
+    return ts('Month only');
+  }
+
+  /**
+   * @return string
+   */
+  public static function getDescription(): string {
+    return ts('The numeric month (1-12) of a date.');
+  }
+
+}
index f56096fb8491b77277c28c96639061fb08e170da..9da481501c37112051674ef408dc527cdce47fc5 100644 (file)
@@ -265,7 +265,7 @@ class SqlFunctionTest extends UnitTestCase {
     $this->assertGreaterThanOrEqual($result[4]['rand'], $result[5]['rand']);
   }
 
-  public function testYearInWhereClause() {
+  public function testDateInWhereClause() {
     $lastName = uniqid(__FUNCTION__);
     $sampleData = [
       ['first_name' => 'abc', 'last_name' => $lastName, 'birth_date' => '2009-11-11'],
@@ -291,6 +291,14 @@ class SqlFunctionTest extends UnitTestCase {
       ->selectRowCount()
       ->execute();
     $this->assertCount(2, $result);
+
+    // Try an expression in the value
+    $result = Contact::get(FALSE)
+      ->addWhere('last_name', '=', $lastName)
+      ->addWhere('MONTH(birth_date)', '=', 'MONTH("2030-11-12")', TRUE)
+      ->addSelect('birth_date')
+      ->execute()->single();
+    $this->assertEquals('2009-11-11', $result['birth_date']);
   }
 
 }