1.9 KiB
1.9 KiB
Date Format Handling for ClickHouse Events API
Problem Description
The event tracking API was experiencing issues with date format compatibility when inserting records into the ClickHouse database. ClickHouse has specific requirements for datetime formats, particularly for its DateTime64 type fields, which weren't being properly addressed in the original implementation.
Root Cause
- JavaScript's default date serialization (
toISOString()) produces formats like2023-08-24T12:34:56.789Z, which includeTas a separator andZas the UTC timezone indicator - ClickHouse prefers datetime values in the format
YYYY-MM-DD HH:MM:SS.SSSfor seamless parsing - The mismatch between these formats was causing insertion errors in the database
Solution Implemented
We created a formatDateTime utility function that properly formats JavaScript Date objects for ClickHouse compatibility:
const formatDateTime = (date: Date) => {
return date.toISOString().replace('T', ' ').replace('Z', '');
};
This function:
- Takes a JavaScript Date object as input
- Converts it to ISO format string
- Replaces the 'T' separator with a space
- Removes the trailing 'Z' UTC indicator
The solution was applied to all date fields in the event payload:
event_timelink_created_atlink_expires_at
Additional Improvements
- We standardized date handling by using a consistent
currentTimevariable - Added type checking for JSON fields to ensure proper serialization
- Improved error handling for date parsing failures
Best Practices for ClickHouse Date Handling
- Always format dates as
YYYY-MM-DD HH:MM:SS.SSSwhen inserting into ClickHouse - Use consistent date handling utilities across your application
- Consider timezone handling explicitly when needed
- For query parameters, use ClickHouse's
parseDateTimeBestEffortfunction when possible - Test with various date formats and edge cases to ensure robustness