{"record":{"id":"cd7b3184a8925e15","repo":"hibernate/hibernate-orm","slug":"format-function-not-supported-on-sybase","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-community-dialects/src/main/java/org/hibernate/community/dialect/SybaseLegacyDialect.java","lineNumber":507,"sourceCode":"\tpublic boolean supportsFractionalTimestampArithmetic() {\n\t\treturn false;\n\t}\n\n\t@Override\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\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\tif ( metadata == null ) {\n\t\t\tbuilder.setUnquotedCaseStrategy( IdentifierCaseStrategy.MIXED );\n\t\t\tbuilder.setQuotedCaseStrategy( IdentifierCaseStrategy.MIXED );\n\t\t}\n\n\t\treturn super.buildIdentifierHelper( builder, metadata );\n\t}\n","sourceCodeStart":489,"sourceCodeEnd":525,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SybaseLegacyDialect.java#L489-L525","documentation":"appendDatetimeFormat is called whenever Hibernate renders the pattern of a datetime formatting function, i.e. the HQL format() function. SybaseLegacyDialect (Sybase ASE) throws UnsupportedOperationException because ASE's CONVERT styles cannot express arbitrary Java-style format patterns, so any query using format() fails during SQL translation.","triggerScenarios":"HQL such as `select format(e.created, 'yyyy-MM-dd') from Event e` (or Criteria format() calls) executed with SybaseLegacyDialect; anything else that routes a datetime format pattern through appendDatetimeFormat.","commonSituations":"Applications ported from Oracle/MySQL where to_char/format work; date truncation/grouping done via formatting in the query; Hibernate 5 to 6 migrations that previously used custom dialect tweaks.","solutions":["Format in Java after fetching (DateTimeFormatter) instead of in the query","Use extraction functions ASE supports: year(e.created), month(e.created), day(e.created)","Extend SybaseLegacyDialect and override appendDatetimeFormat to map a subset of patterns to convert(varchar, x, style)","Use a native query with ASE convert(varchar, datecol, style)"],"exampleFix":"// before\nList<String> days = em.createQuery(\n    \"select format(e.created, 'yyyy-MM-dd') from Event e\", String.class).getResultList();\n\n// after: format in Java\nList<LocalDateTime> created = em.createQuery(\n    \"select e.created from Event e\", LocalDateTime.class).getResultList();\nString day = created.get(0).format(DateTimeFormatter.ofPattern(\"yyyy-MM-dd\"));","handlingStrategy":"fallback","validationCode":"// Guard: do not emit format() when the dialect cannot render datetime patterns\nDialect d = sessionFactory.getJdbcServices().getDialect();\nboolean canFormat = !(d instanceof SybaseLegacyDialect);\n// if (!canFormat) fetch raw timestamps and format with DateTimeFormatter in Java","typeGuard":null,"tryCatchPattern":"try {\n    return em.createQuery(\"select format(e.created,'yyyy-MM-dd') from Event e\", String.class)\n             .getResultList();\n} catch (UnsupportedOperationException e) {\n    if (e.getMessage() != null && e.getMessage().contains(\"format()\")) {\n        return formatInJava(em.createQuery(\"select e.created from Event e\", LocalDateTime.class)\n                             .getResultList());\n    }\n    throw e;\n}","preventionTips":["Default to formatting dates in Java; use in-query formatting only where all target dialects support it","For date-based grouping, use year()/month()/day() extraction instead of format()","If ASE must format in SQL, extend SybaseLegacyDialect with a convert(varchar, x, style) implementation"],"tags":["hibernate","sybase-ase","datetime","format-function","unsupported-operation"],"backgroundTag":"datetime-format-function-unsupported","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}