Skip to content

Commit 0cfc593

Browse files
authored
Fix: time format filtering for dates and timestamp (#1599)
1 parent 15ad07c commit 0cfc593

2 files changed

Lines changed: 28 additions & 8 deletions

File tree

sqlmesh/core/model/definition.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
from sqlmesh.core.model.seed import CsvSeedReader, Seed, create_seed
3535
from sqlmesh.core.renderer import ExpressionRenderer, QueryRenderer
3636
from sqlmesh.utils import str_to_bool
37-
from sqlmesh.utils.date import TimeLike, make_inclusive, to_datetime
37+
from sqlmesh.utils.date import TimeLike, make_inclusive, to_datetime, to_ds, to_ts
3838
from sqlmesh.utils.errors import ConfigError, SQLMeshError, raise_config_error
3939
from sqlmesh.utils.hashing import hash_data
4040
from sqlmesh.utils.jinja import JinjaMacroRegistry, extract_macro_references
@@ -514,9 +514,6 @@ def convert_to_time_column(
514514
) -> exp.Expression:
515515
"""Convert a TimeLike object to the same time format and type as the model's time column."""
516516
if self.time_column:
517-
if self.time_column.format:
518-
time = to_datetime(time).strftime(self.time_column.format)
519-
520517
if columns_to_types is None:
521518
columns_to_types = self.columns_to_types_or_raise
522519

@@ -526,12 +523,18 @@ def convert_to_time_column(
526523
)
527524

528525
time_column_type = columns_to_types[self.time_column.column]
526+
527+
if time_column_type.is_type(exp.DataType.Type.DATE):
528+
return exp.cast(exp.Literal.string(to_ds(time)), to="date")
529+
if time_column_type.this in exp.DataType.TEMPORAL_TYPES:
530+
return exp.cast(exp.Literal.string(to_ts(time)), to=time_column_type.this)
531+
532+
if self.time_column.format:
533+
time = to_datetime(time).strftime(self.time_column.format)
529534
if time_column_type.this in exp.DataType.TEXT_TYPES:
530535
return exp.Literal.string(time)
531-
elif time_column_type.this in exp.DataType.NUMERIC_TYPES:
536+
if time_column_type.this in exp.DataType.NUMERIC_TYPES:
532537
return exp.Literal.number(time)
533-
elif time_column_type.this in exp.DataType.TEMPORAL_TYPES:
534-
return exp.cast(exp.Literal.string(time), time_column_type)
535538
return exp.convert(time)
536539

537540
def update_schema(

tests/core/test_model.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1215,7 +1215,24 @@ def test_convert_to_time_column():
12151215
"""
12161216
)
12171217
model = load_sql_based_model(expressions)
1218-
assert model.convert_to_time_column("2022-01-01") == d.parse_one("CAST('20220101' AS date)")
1218+
assert model.convert_to_time_column("2022-01-01") == d.parse_one("CAST('2022-01-01' AS DATE)")
1219+
1220+
expressions = d.parse(
1221+
"""
1222+
MODEL (
1223+
name db.table,
1224+
kind INCREMENTAL_BY_TIME_RANGE(
1225+
time_column ds
1226+
)
1227+
);
1228+
1229+
SELECT ds::timestamp
1230+
"""
1231+
)
1232+
model = load_sql_based_model(expressions)
1233+
assert model.convert_to_time_column("2022-01-01") == d.parse_one(
1234+
"CAST('2022-01-01T00:00:00+00:00' AS TIMESTAMP)"
1235+
)
12191236

12201237

12211238
def test_parse(assert_exp_eq):

0 commit comments

Comments
 (0)