我有一列的日期格式为小数,例如:20210830。
我想把这个号码转换成08/30/2021
的日期格式
我尝试过使用convert,但数据库向我发出了一个错误,即convert不是一个有效的函数。Cast似乎有效,但每次只返回一个null值。
此声明将验证:
SELECT CAST(CAST(CONTCLMPDTE AS VARCHAR(8)) AS DATE)
FROM CMSFIL.JCTDSC AS COMPLDATE
此语句有效,但仅输出null。作为背景,我正在从Db2数据库中查询。
我的最终目标是使用这个转换后的日期来获取与当天的差异。
如
DAY(CURRENT_DATE) - DAY(COMPLDATE)
将其转换为日期,您可以像这样进行
CREATE TABLE JCTDSC (
CONTCLMPDTE varchar(10)
);
INSERT INTO JCTDSC VALUES ('20,220,830')
SELECT date(to_date(REPLACE(CONTCLMPDTE,',',''),'YYYYMMDD')) FROM JCTDSC AS COMPLDATE
1 |
---|
2022-08-30 |
经过漫长的几天,我几乎把头发都拔了出来,下面是对我有效的方法。
SELECT date(substr(CONTCLMPDTE,1,4)||'-'||substr(CONTCLMPDTE,5,2)||'-'||substr(CONTCLMPDTE,7,2)) FROM JCTDSC WHERE COMPANYNUMBER={Company Number} AND JOBNUMBER={Job Number} LIMIT 1
格式为从yyyymmdd到mm/dd/yyyy。它还使用此代码查找current_date和CONTCLMPDTE之间的天数。
DAYS(CURRENT_DATE) - DAYS({COntract Compl Date Formatted})
谢谢大家的帮助!
您可能会得到一个错误,因为您有一些INT/DECIMAL值,无法使用此模式转换为日期
解决方案是创建一些";"安全";转换函数";吃";错误如下。
CREATE FUNCTION DATE_SAFE (P_DT INT)
RETURNS DATE
CONTAINS SQL
NO EXTERNAL ACTION
DETERMINISTIC
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
RETURN CAST (NULL AS DATE);
END;
RETURN DATE (TO_DATE (CAST (P_DT AS CHAR (8)), 'YYYYMMDD'));
END
用法:
SELECT
CONTCLMPDTE
--, DATE (TO_DATE (CAST (CONTCLMPDTE AS CHAR (8)), 'YYYYMMDD'))
, DATE_SAFE (CONTCLMPDTE)
FROM (VALUES 0, 20220830) T (CONTCLMPDTE)
如果相应的INT不能转换为DATE,并且在只使用内置函数取消注释注释行时不会抛出错误,则函数返回NULL。
只需要将值转换为日期格式的字符串。然后可以使用date((函数将其转换为日期。
create table qtemp/dec_vals (
col1 decimal(8,0) );
insert into qtemp/dec_vals
values (20200830), (20200831), (20200901), (20200902), (20200903), (20200904), (20200905), (20200906);
select date(substr(char(col1), 5, 2) || '/' || substr(char(col1), 7, 2) || '/' || substr(char(col1), 1, 4)) from qtemp/dec_vals;