| 111 | return self.date_extract_sql(lookup_type, sql, params) |
| 112 | |
| 113 | def datetime_trunc_sql(self, lookup_type, sql, params, tzname): |
| 114 | sql, params = self._convert_sql_to_tz(sql, params, tzname) |
| 115 | fields = ["year", "month", "day", "hour", "minute", "second"] |
| 116 | format = ("%Y-", "%m", "-%d", " %H:", "%i", ":%s") |
| 117 | format_def = ("0000-", "01", "-01", " 00:", "00", ":00") |
| 118 | if lookup_type == "quarter": |
| 119 | return ( |
| 120 | f"CAST(DATE_FORMAT(MAKEDATE(YEAR({sql}), 1) + " |
| 121 | f"INTERVAL QUARTER({sql}) QUARTER - " |
| 122 | f"INTERVAL 1 QUARTER, %s) AS DATETIME)" |
| 123 | ), (*params, *params, "%Y-%m-01 00:00:00") |
| 124 | if lookup_type == "week": |
| 125 | return ( |
| 126 | f"CAST(DATE_FORMAT(" |
| 127 | f"DATE_SUB({sql}, INTERVAL WEEKDAY({sql}) DAY), %s) AS DATETIME)" |
| 128 | ), (*params, *params, "%Y-%m-%d 00:00:00") |
| 129 | try: |
| 130 | i = fields.index(lookup_type) + 1 |
| 131 | except ValueError: |
| 132 | pass |
| 133 | else: |
| 134 | format_str = "".join(format[:i] + format_def[i:]) |
| 135 | return f"CAST(DATE_FORMAT({sql}, %s) AS DATETIME)", (*params, format_str) |
| 136 | return sql, params |
| 137 | |
| 138 | def time_trunc_sql(self, lookup_type, sql, params, tzname=None): |
| 139 | sql, params = self._convert_sql_to_tz(sql, params, tzname) |