Snowflake Data Type Support

How Simon maps Snowflake column types across the platform — Schema Builder, Datasets, Segments, and Content.

📘

This page is a cross-feature reference. It describes how Snowflake column types are recognized and mapped throughout Simon — covering the Schema Builder, Datasets, Segment Builder, and Content personalization.

When you connect a Snowflake table or create a dataset, Simon inspects each column's type and maps it to one of Simon's internal data types. The mapped type determines how a field behaves everywhere in the product — what operators are available in the Segment Builder, what values can be personalized in templates, and so on.

Simon Data Types

Simon uses a small set of canonical data types internally. Every field in your data model is assigned one of these types, regardless of the specific Snowflake type the column was declared with.

Simon TypeDescription
BooleanTrue/false indicator
IntegerWhole number
FloatFloating-point number
StringText / character data
TimestampDate and/or time value
ArrayOrdered list of values
VariantSemi-structured JSON data

Snowflake → Simon Type Mapping

The table below shows how every Snowflake column type is mapped to a Simon type. Types are grouped by the Simon type they produce.

Simon TypeSnowflake Types
BooleanBOOLEAN
IntegerINT, INTEGER, BIGINT, SMALLINT, TINYINT, BYTEINT, NUMBER, DECIMAL, DEC, NUMERIC, FIXED
FloatFLOAT, FLOAT4, FLOAT8, DOUBLE, DOUBLE PRECISION, REAL, DECFLOAT
StringVARCHAR, CHAR, CHARACTER, NCHAR, STRING, TEXT, BINARY, VARBINARY, OBJECT
TimestampTIMESTAMP, TIMESTAMP_NTZ, TIMESTAMP_LTZ, TIMESTAMP_TZ, DATETIME, DATE, TIME
ArrayARRAY
VariantVARIANT
⚠️

Snowflake column types that are not in the table above — such as GEOGRAPHY or GEOMETRY — will default to String. Any data in those columns will be handled as its string serialization.

A note on Integer vs. Float

Simon uses Integer for fixed-point numeric types (whole numbers, currencies, counts) and Float for floating-point types. Snowflake's NUMBER and DECIMAL families include both — Simon classifies them as Integer when they come from direct table mapping (Schema Builder) and Float when they come from view-based datasets (see View-Based Datasets below). In practice, both Integer and Float fields support the same numeric operators in the Segment Builder.


Feature Behavior

Schema Builder — Mapped Datasets

When you map a table or view using the Schema Builder, Simon reads column types from Snowflake's INFORMATION_SCHEMA.COLUMNS view and applies the mapping above. This happens:

  • When you first connect a table
  • Whenever a warehouse refresh runs and detects new columns

All Simon types are supported. If a column's type changes in Snowflake (for example, if a column is re-created with a different type), Simon will update the stored type automatically on the next refresh.

Tip: If a field appears with the wrong type in the Schema Builder, you can correct it in the Django admin and the fix will be preserved unless the underlying Snowflake column type also changes.


View-Based Datasets

When you create a dataset using a custom query, Simon creates a Snowflake view from your query and then inspects the view's column types using DESCRIBE VIEW. The same mapping table applies.

ℹ️

Snowflake's DESCRIBE VIEW output for a timestamp column will typically include a precision suffix — for example, TIMESTAMP_NTZ(9). Simon strips the precision and maps on the base type name, so TIMESTAMP_NTZ(9) is treated identically to TIMESTAMP_NTZ.

All Simon types are supported. If your query selects a column with an unrecognized type, it will default to String.


Segment Builder

All Simon types are available as filter conditions in the Segment Builder. The available operators vary by type:

Simon TypeAvailable Operators
Booleanis true, is false, is null, is not null
Integerequal to, not equal to, greater than, greater than or equal to, less than, less than or equal to, is between, in, is null, is not null
Floatequal to, not equal to, greater than, greater than or equal to, less than, less than or equal to, is null, is not null
Stringis, is not, contains, does not contain, begins with, does not begin with, ends with, does not end with, in, like, is null, is not null
Timestampis, is before, is before date, is after, is after date, is between, is between dates, is null, is not null
Arrayincludes, does not include, is available, is not available
Variantis null, is not null
⚠️

Variant fields have very limited support in the Segment Builder — only null checks are available. If you need to filter on values inside a Variant/JSON column, consider creating a view-based dataset to extract the relevant fields as typed columns.

For additional detail on segment operators, see Supported Data Types.


Content — Templates and Blocks

All Simon data types can be used for content personalization in email templates and blocks, including in Jinja template syntax. There are no type restrictions at the content layer — any field that is marked as a content field in the Schema Builder will be available for personalization, regardless of its type.

The runtime value passed to a template is the raw value stored in your Snowflake column:

Simon TypeTemplate value
Booleantrue or false
IntegerWhole number
FloatDecimal number
StringText string
TimestampISO 8601 string (e.g. 2024-03-15T10:30:00Z)
ArrayJSON array
VariantJSON object or scalar

Troubleshooting

A timestamp column is showing up as String

This most commonly occurs with view-based datasets when the Snowflake view column type resolves to a timestamp variant (TIMESTAMP_NTZ, TIMESTAMP_LTZ, or TIMESTAMP_TZ) rather than bare TIMESTAMP. Simon handles all Snowflake timestamp variants correctly. If you see this, try re-saving the dataset to trigger a fresh type introspection.

For mapped datasets, verify the column's type in INFORMATION_SCHEMA.COLUMNS — if Snowflake is reporting a non-standard type, Simon may have fallen back to String.

A numeric column is showing up as Float instead of Integer (or vice versa)

Snowflake's NUMBER type can represent both integers and decimals depending on its scale parameter (e.g. NUMBER(38,0) is integer-like, NUMBER(10,2) has decimals). Simon maps both to its own Integer or Float type based on the mapping table above. Both types support the same numeric operators in the Segment Builder, so in most cases this distinction does not affect functionality.

A field is missing from the Segment Builder

Only fields that are marked as content fields or join keys in the Schema Builder are surfaced in the Segment Builder. If a field is present in the data model but not appearing as a filter option, check its configuration in the Schema Builder.