{"record":{"id":"4f91169ab6e27c19","repo":"hibernate/hibernate-orm","slug":"format-function-not-supported-on-sybase-4f9116","errorCode":null,"errorMessage":"format() function not supported on Sybase","messagePattern":"format\\(\\) function not supported on Sybase","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/dialect/SybaseDialect.java","lineNumber":522,"sourceCode":"\tpublic boolean supportsFractionalTimestampArithmetic() {\n\t\treturn false;\n\t}\n\n\t@Override @SuppressWarnings(\"deprecation\")\n\tpublic String timestampaddPattern(TemporalUnit unit, TemporalType temporalType, IntervalType intervalType) {\n\t\t//TODO!!\n\t\treturn \"dateadd(?1,?2,?3)\";\n\t}\n\n\t@Override @SuppressWarnings(\"deprecation\")\n\tpublic String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalType, TemporalType toTemporalType) {\n\t\t//TODO!!\n\t\treturn \"datediff(?1,?2,?3)\";\n\t}\n\n\t@Override\n\tpublic void appendDatetimeFormat(SqlAppender appender, String format) {\n\t\tthrow new UnsupportedOperationException( \"format() function not supported on Sybase\");\n\t}\n\n\t@Override\n\tpublic boolean supportsStandardCurrentTimestampFunction() {\n\t\treturn false;\n\t}\n\n\t@Override\n\tpublic IdentifierHelper buildIdentifierHelper(IdentifierHelperBuilder builder, DatabaseMetaData metadata)\n\t\t\tthrows SQLException {\n\t\t// Default to MIXED because the jconnect driver doesn't seem to report anything useful\n\t\tbuilder.setUnquotedCaseStrategy( IdentifierCaseStrategy.MIXED );\n\t\tif ( metadata == null ) {\n\t\t\tbuilder.setQuotedCaseStrategy( IdentifierCaseStrategy.MIXED );\n\t\t}\n\n\t\treturn super.buildIdentifierHelper( builder, metadata );\n\t}","sourceCodeStart":504,"sourceCodeEnd":540,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/dialect/SybaseDialect.java#L504-L540","documentation":"SybaseDialect.appendDatetimeFormat() throws UnsupportedOperationException('format() function not supported on Sybase') because SAP ASE/JConnect has no portable format() equivalent for datetime-to-string formatting with a pattern. In Hibernate 6, every HQL `format(datetime, pattern)` call (and functions that render a datetime format, like certain str()/to_char translations) funnels into this method; on Sybase the dialect deliberately fails rather than emitting wrong SQL.","triggerScenarios":"Executing HQL that uses `format(e.timestamp, 'yyyy-MM-dd')` (or JPQL/Criteria equivalents that map onto appendDatetimeFormat) against a Sybase ASE datasource using SybaseDialect; also `str(...)` style datetime formatting in HQL that resolves to the datetime-format path.","commonSituations":"Applications developed on PostgreSQL/MySQL (to_char/date_format) migrated to Sybase ASE; reporting queries that format dates in the database; shared query libraries where formatting works on most dialects but explodes on the Sybase profile.","solutions":["Format dates in application code: select the raw timestamp and format with java.time.format.DateTimeFormatter.","Register a dialect function for Sybase's strftime-style equivalent if your ASE version has one (e.g. via a custom FunctionContributor implementing appendDatetimeFormat with 'strfmt' and subclassing SybaseDialect).","Use native SQL queries with ASE's convert(varchar, col, style) for the required shapes.","Avoid format()/to_char-style HQL in shared repository code, or branch it out for Sybase profiles."],"exampleFix":"// before (HQL, works on PG/MySQL, throws on Sybase)\nselect format(e.createdAt, 'yyyy-MM-dd') from Event e\n\n// after — fetch raw and format in Java\nselect e.createdAt from Event e\n// then: createdAt.format(DateTimeFormatter.ofPattern(\"yyyy-MM-dd\"))","handlingStrategy":"fallback","validationCode":"static boolean supportsDatetimeFormat(Dialect d) { return !(d instanceof SybaseDialect); }\n// build HQL with format() only when supportsDatetimeFormat(dialect); otherwise select raw temporal and format in Java","typeGuard":null,"tryCatchPattern":"try {\n  return em.createQuery(hqlWithFormat).getResultList();\n} catch (UnsupportedOperationException e) {\n  if (e.getMessage().contains(\"format() function not supported on Sybase\")) {\n    List<Timestamp> raw = em.createQuery(hqlRaw, Timestamp.class).getResultList();\n    return raw.stream().map(t -> t.toLocalDateTime().format(FMT)).toList();\n  }\n  throw e;\n}","preventionTips":["Do date formatting in Java, not in HQL, when Sybase ASE is a supported target.","If ASE formatting is mandatory, subclass SybaseDialect and implement appendDatetimeFormat with strfmt/convert(varchar,...,style).","Keep a dialect-support matrix for HQL functions in shared query code."],"tags":["hibernate","sybase","ase","dialect","hql","datetime-format","unsupportedoperationexception"],"backgroundTag":"sql-function-not-supported-by-dialect","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}