| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- function knexUtils(knex) {
- function truncatedTimestamp(columnName, precision = 'hour') {
- switch (knex.client.driverName) {
- case 'sqlite3':
- case 'better-sqlite3':
- // SQLite uses strftime for date truncation
- const sqliteFormats = {
- second: '%Y-%m-%d %H:%M:%S',
- minute: '%Y-%m-%d %H:%M:00',
- hour: '%Y-%m-%d %H:00:00',
- day: '%Y-%m-%d 00:00:00',
- };
- return knex.raw(`strftime('${sqliteFormats[precision]}', ${columnName})`); // Default to 'hour'
- case 'mssql':
- // For MSSQL, we can use FORMAT or CONVERT to truncate the timestamp
- const mssqlFormats = {
- second: 'yyyy-MM-dd HH:mm:ss',
- minute: 'yyyy-MM-dd HH:mm:00',
- hour: 'yyyy-MM-dd HH:00:00',
- day: 'yyyy-MM-dd 00:00:00',
- };
- return knex.raw(`FORMAT(${columnName}, '${mssqlFormats[precision]}'`);
- case 'pg':
- case 'pgnative':
- case 'cockroachdb':
- // PostgreSQL has the `date_trunc` function, which is ideal for this task
- return knex.raw(`date_trunc(?, ${columnName})`, [precision]);
- case 'oracle':
- case 'oracledb':
- // Oracle truncates dates using the `TRUNC` function
- return knex.raw(`TRUNC(${columnName}, ?)`, [precision]);
- case 'mysql':
- case 'mysql2':
- // MySQL can use the DATE_FORMAT function to truncate
- const mysqlFormats = {
- second: '%Y-%m-%d %H:%i:%s',
- minute: '%Y-%m-%d %H:%i:00',
- hour: '%Y-%m-%d %H:00:00',
- day: '%Y-%m-%d 00:00:00',
- };
- return knex.raw(`DATE_FORMAT(${columnName}, '${mysqlFormats[precision]}')`);
- default:
- throw new Error(`${this.client.driverName} does not support timestamp truncation with precision`);
- }
- }
- return {
- truncatedTimestamp
- }
- }
- module.exports = {
- knexUtils
- }
|