{"record":{"id":"8227876471129f5d","repo":"pentaho/pentaho-kettle","slug":"argument-of-trunc-of-date-has-to-be-between-0-and-5-822787","errorCode":null,"errorMessage":"Argument of TRUNC of date has to be between 0 and 5","messagePattern":"Argument of TRUNC of date has to be between 0 and 5","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/scriptvalues_mod/ScriptValuesAddedFunctions.java","lineNumber":2552,"sourceCode":"        cal.set( Calendar.MONTH, 0 );\n        // DAYS\n      case 4:\n        cal.set( Calendar.DAY_OF_MONTH, 1 );\n        // HOURS\n      case 3:\n        cal.set( Calendar.HOUR_OF_DAY, 0 );\n        // MINUTES\n      case 2:\n        cal.set( Calendar.MINUTE, 0 );\n        // SECONDS\n      case 1:\n        cal.set( Calendar.SECOND, 0 );\n        // MILI-SECONDS\n      case 0:\n        cal.set( Calendar.MILLISECOND, 0 );\n        break;\n      default:\n        throw Context.reportRuntimeError( \"Argument of TRUNC of date has to be between 0 and 5\" );\n    }\n    return cal.getTime();\n  }\n\n  public static void moveFile( Context actualContext, Scriptable actualObject, Object[] ArgList,\n    Function FunctionContext ) {\n\n    try {\n      if ( ArgList.length == 3\n        && !isNull( ArgList[0] ) && !isNull( ArgList[1] ) && !isUndefined( ArgList[0] )\n        && !isUndefined( ArgList[1] ) ) {\n        FileObject fileSource = null, fileDestination = null;\n\n        try {\n          // Source file to move\n          Bowl bowl = getBowl( actualObject );\n          fileSource = KettleVFS.getInstance( bowl ).getFileObject( Context.toString( ArgList[0] ) );\n          // Destination filename","sourceCodeStart":2534,"sourceCodeEnd":2570,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/scriptvalues_mod/ScriptValuesAddedFunctions.java#L2534-L2570","documentation":"truncDate's level argument must be an integer between 0 and 5 (millisecond, second, minute, hour, day, month). The switch's default branch throws this error for any other value. It is a value-range validation failure inside the valid 2-argument call.","triggerScenarios":"Calling truncDate(d, 6) or higher, a negative level, or a JS number that converts to an Integer outside 0-5 (e.g. level computed from variables or a field containing 99).","commonSituations":"Misremembering the level scale (expecting 1-12 for months or Calendar constants like Calendar.MONTH=2 semantics confusion); passing a level read from a lookup table with bad data.","solutions":["Use a level in 0..5: 0=ms,1=sec,2=min,3=hour,4=day,5=month.","Validate before calling: if (level >= 0 && level <= 5) { ... } else fall back.","If you need year truncation or other granularities, use Calendar/date functions in the script instead of truncDate.","Clamp or map external level data: level = Math.max(0, Math.min(5, level))."],"exampleFix":"// before\nvar d = truncDate(orderDate, 7); // invalid level\n// after\nvar d = truncDate(orderDate, 5); // truncate to month start","handlingStrategy":"validation","validationCode":"if (lvl === undefined || lvl === null || lvl < 0 || lvl > 5) { lvl = 4; } // default to day truncation\nvar d = truncDate(orderDate, lvl);","typeGuard":"function isValidLevel(v) { return Number.isInteger(v) && v >= 0 && v <= 5; }","tryCatchPattern":"try { d = truncDate(dt, lvl); } catch (e) { if (e.message.indexOf('between 0 and 5') >= 0) { d = dt; } else { throw e; } }","preventionTips":["Map external level data into 0-5 before calling","Clamp: lvl = Math.max(0, Math.min(5, lvl))","Do not use Calendar.* constants as levels"],"tags":["javascript","scripting","date","value-out-of-range"],"backgroundTag":"value-out-of-range","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}