Sql 使用CAST时格式化日期

Sql 使用CAST时格式化日期,sql,oracle,casting,ansi,to-char,Sql,Oracle,Casting,Ansi,To Char,我想使用CAST将DATE类型转换为VARCHAR2类型 DBUSER >SELECT CAST(CURRENT_DATE AS VARCHAR2(20)) THE_DATE from DUAL; THE_DATE -------------------- 09-AUG-17 但是,我需要将VARCHAR2结果格式化为“YYYYMM”。我知道我可以通过更改会议日期格式来实现这一效果,但我宁愿不这样做 DBUSER >ALTER SESSION SET NLS_DATE_FORMAT

我想使用
CAST
DATE
类型转换为
VARCHAR2
类型

DBUSER >SELECT CAST(CURRENT_DATE AS VARCHAR2(20)) THE_DATE from DUAL;
THE_DATE
--------------------
09-AUG-17
但是,我需要将VARCHAR2结果格式化为“YYYYMM”。我知道我可以通过更改会议日期格式来实现这一效果,但我宁愿不这样做

DBUSER >ALTER SESSION SET NLS_DATE_FORMAT = 'YYYYMM';
Session altered.

DBUSER >SELECT CAST(CURRENT_DATE AS VARCHAR2(20)) THE_DATE from DUAL;
THE_DATE
--------------------
201708
我希望避免使用Oracle专有的to_CHAR()函数。有人对此有什么建议吗?

这可能会对您有所帮助:

SELECT extract(year from CURRENT_DATE) || case when extract(month from CURRENT_DATE) <10 THEN '0' || extract(month from CURRENT_DATE) END  THE_DATE from DUAL;
选择提取(从当前日期算起的年份)|提取时的大小写(从当前日期算起的月份)
我正在尽可能地标准化ANSI SQL,并避免专有供应商的非标准实现

中没有指定将数据类型格式化为字符串的函数

最简单的解决方案是使用Oracle为此提供的功能:

SELECT TO_CHAR( yourdate, 'YYYYMM' ) FROM yourtable;
但是,您可以使用
EXTRACT
函数(ANSI标准中)获取年和月组件:

然后,您需要将数字转换为字符串并连接字符串:

SELECT TO_CHAR( EXTRACT( YEAR FROM yourdate ) )
       || TO_CHAR( EXTRACT( MONTH FROM yourdate ) )
FROM   yourtable
但您试图避免使用
字符
,因此您可以:

SELECT CAST( EXTRACT( YEAR FROM yourdate ) AS VARCHAR2(4) )
       || CAST( EXTRACT( MONTH FROM yourdate ) AS VARCHAR2(2) )
FROM   yourtable
或者,使用隐式强制转换

SELECT EXTRACT( YEAR FROM yourdate )
       || EXTRACT( MONTH FROM yourdate )
FROM   yourtable
但是,如果年份不是4位数或月份不是2位数,则需要填充值;同样,简单的解决方案是
到\u CHAR

SELECT TO_CHAR( EXTRACT( YEAR FROM yourdate ), 'FM0000' )
       || TO_CHAR( EXTRACT( MONTH FROM yourdate ), 'FM00' )
FROM   yourtable
LPAD

SELECT LPAD( EXTRACT( YEAR FROM yourdate ), 4, '0' )
       || LPAD( EXTRACT( MONTH FROM yourdate ), 4, '0' )
FROM   yourtable
但这两个标准都不在ANSI标准中,因此:

SELECT CASE
         WHEN EXTRACT( YEAR FROM yourdate ) < 10 THEN '000'
         WHEN EXTRACT( YEAR FROM yourdate ) < 100 THEN '00'
         WHEN EXTRACT( YEAR FROM yourdate ) < 1000 THEN '0'
         ELSE NULL
       END
       || EXTRACT( YEAR FROM yourdate )
       || CASE
         WHEN EXTRACT( MONTH FROM yourdate ) < 10 THEN '0'
       END
       || EXTRACT( MONTH FROM yourdate )
FROM   yourtable;

选择案例
当摘录(从日期算起的年份)<10时,则为“000”
当摘录(从日期算起的年份)<100时,则为'00'
当提取(从日期算起的年份)<1000时,则为“0”
否则无效
结束
||摘录(从您的日期算起的年份)
||案例
当提取(从您的日期算起的月份)<10时,则为“0”
结束
||摘录(从您的日期算起的月份)
||案例
当提取(从日期算起的日期)<10时,则为“0”
结束
||摘录(从您的日期算起的日期)
||案例
当提取(从强制转换开始的小时数(yourdate作为时间戳))小于10时,则为“0”
结束
||摘录(从演员表开始的小时数(您的日期作为时间戳))
||案例
当提取(从演员表中提取的分钟数(您的日期作为时间戳))小于10时,则为“0”
结束
||摘录(演员表的分钟数(您的日期作为时间戳))
||案例
当提取(第二次从强制转换(yourdate作为时间戳))小于10时,则为“0”
结束
||摘录(第二个从CAST(yourdate作为时间戳))
从你的桌子上;

[TL/DR]只要用
来写字符就行了

是的,我知道这很管用。我想避免使用Oracle专有的to_CHAR()函数。我编辑了我的答案。很抱歉,我没听清你对这个问题的解释。我同意这是可行的。我同意它使用ANSI函数。我希望有一个更紧凑,更容易打字的东西。有什么想法吗?这不是使用
CAST
将日期转换为字符串-这是使用
EXTRACT
获取数值,然后使用字符串连接运算符隐式转换为字符串;
CAST
所做的就是将字符串转换为字符串(最大长度为20)。@MT0-同意。
CAST
甚至不需要。你为什么要尝试重新发明轮子?如果你解释一下为什么不想使用
to_CHAR()
。你为什么要对字符串进行强制转换?这是你的应用层可以/应该做的吗?@lit我的观点是,没有处理日期的标准方法-每个RDBMS都有自己的专有方法,使用
CAST
不能替代。每个RDBMS都处理日期-有些实现ANSI标准,有些不实现(包括Oracle—Oracle
DATE
数据类型是ANSI
DATE
TIME
数据类型的串联,Oracle没有
TIME
数据类型)但是,我在中找不到任何指定函数将日期时间格式化为字符串的内容;因为没有标准,所以我们只能使用专有解决方案。
SELECT CASE
         WHEN EXTRACT( YEAR FROM yourdate ) < 10 THEN '000'
         WHEN EXTRACT( YEAR FROM yourdate ) < 100 THEN '00'
         WHEN EXTRACT( YEAR FROM yourdate ) < 1000 THEN '0'
         ELSE NULL
       END
       || EXTRACT( YEAR FROM yourdate )
       || CASE
         WHEN EXTRACT( MONTH FROM yourdate ) < 10 THEN '0'
       END
       || EXTRACT( MONTH FROM yourdate )
FROM   yourtable;
SELECT TO_CHAR( yourdate, 'YYYYMMDDHH24MISS' ) FROM yourtable
SELECT CASE
         WHEN EXTRACT( YEAR FROM yourdate ) < 10 THEN '000'
         WHEN EXTRACT( YEAR FROM yourdate ) < 100 THEN '00'
         WHEN EXTRACT( YEAR FROM yourdate ) < 1000 THEN '0'
         ELSE NULL
       END
       || EXTRACT( YEAR FROM yourdate )
       || CASE
         WHEN EXTRACT( MONTH FROM yourdate ) < 10 THEN '0'
       END
       || EXTRACT( MONTH FROM yourdate )
       || CASE
         WHEN EXTRACT( DAY FROM yourdate ) < 10 THEN '0'
       END
       || EXTRACT( DAY FROM yourdate )
       || CASE
         WHEN EXTRACT( HOUR FROM CAST( yourdate AS TIMESTAMP ) ) < 10 THEN '0'
       END
       || EXTRACT( HOUR FROM CAST( yourdate AS TIMESTAMP ) )
       || CASE
         WHEN EXTRACT( MINUTE FROM CAST( yourdate AS TIMESTAMP ) ) < 10 THEN '0'
       END
       || EXTRACT( MINUTE FROM CAST( yourdate AS TIMESTAMP ) )
       || CASE
         WHEN EXTRACT( SECOND FROM CAST( yourdate AS TIMESTAMP ) ) < 10 THEN '0'
       END
       || EXTRACT( SECOND FROM CAST( yourdate AS TIMESTAMP ) )
FROM   yourtable;