You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by "Julian Hyde (JIRA)" <ji...@apache.org> on 2019/04/04 17:48:00 UTC

[jira] [Created] (CALCITE-2980) Implement the FORMAT clause of the CAST operator (added in SQL:2016)

Julian Hyde created CALCITE-2980:
------------------------------------

             Summary: Implement the FORMAT clause of the CAST operator (added in SQL:2016)
                 Key: CALCITE-2980
                 URL: https://issues.apache.org/jira/browse/CALCITE-2980
             Project: Calcite
          Issue Type: Bug
            Reporter: Julian Hyde


SQL:2016 adds an optional {{FORMAT format}} clause to the {{CAST}} operator. It is a standard way to do what functions like {{TO_DATE}}, {{TO_NUMBER}}, {{TO_CHAR}}, {{TO_TIMESTAMP}} have done in an ad hoc way (and with differing specifications among databases).

Here is an example:
{code:java}
cast('01-05-2017' as date format 'DD-MM-YYYY')
{code}
The following paragraphs are copied from IMPALA-4018, which describes implementing this in Impala. (That case also describes cases where the implementations of {{TO_TIMESTAMP}} etc. in Hive, Impala, Oracle and PostgreSQL are not consistent with each other. We should take note as we implement these functions in Calcite.)

SQL:2016 defines the following datetime templates
{noformat}
<datetime template> ::=
  { <datetime template part> }...
<datetime template part> ::=
    <datetime template field>
  | <datetime template delimiter>
<datetime template field> ::=
    <datetime template year>
  | <datetime template rounded year>
  | <datetime template month>
  | <datetime template day of month>
  | <datetime template day of year>
  | <datetime template 12-hour>
  | <datetime template 24-hour>
  | <datetime template minute>
  | <datetime template second of minute>
  | <datetime template second of day>
  | <datetime template fraction>
  | <datetime template am/pm>
  | <datetime template time zone hour>
  | <datetime template time zone minute>
<datetime template delimiter> ::=
    <minus sign>
  | <period>
  | <solidus>
  | <comma>
  | <apostrophe>
  | <semicolon>
  | <colon>
  | <space>
<datetime template year> ::=
  YYYY | YYY | YY | Y
<datetime template rounded year> ::=
  RRRR | RR
<datetime template month> ::=
  MM
<datetime template day of month> ::=
  DD
<datetime template day of year> ::=
  DDD
<datetime template 12-hour> ::=
  HH | HH12
<datetime template 24-hour> ::=
  HH24
<datetime template minute> ::=
  MI
<datetime template second of minute> ::=
  SS
<datetime template second of day> ::=
  SSSSS
<datetime template fraction> ::=
  FF1 | FF2 | FF3 | FF4 | FF5 | FF6 | FF7 | FF8 | FF9
<datetime template am/pm> ::=
  A.M. | P.M.
<datetime template time zone hour> ::=
  TZH
<datetime template time zone minute> ::=
  TZM
{noformat}
SQL:2016 also introduced the {{FORMAT}} clause for {{CAST}} which is the standard way to do string <> datetime conversions
{noformat}
<cast specification> ::=
  CAST <left paren>
      <cast operand> AS <cast target>
      [ FORMAT <cast template> ]
      <right paren>
<cast operand> ::=
    <value expression>
  | <implicitly typed value specification>
<cast target> ::=
    <domain name>
  | <data type>
<cast template> ::=
  <character string literal>
{noformat}
For example:
{noformat}
CAST(<datetime> AS <char string type> [FORMAT <template>])
CAST(<char string> AS <datetime type> [FORMAT <template>])
cast(dt as string format 'DD-MM-YYYY')
{noformat}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)