Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将年、月和日三列转换为单个日期Oracle_Oracle_Date_Type Conversion - Fatal编程技术网

将年、月和日三列转换为单个日期Oracle

将年、月和日三列转换为单个日期Oracle,oracle,date,type-conversion,Oracle,Date,Type Conversion,我有一个以不同方式保存日期的表,三列,一列表示年,另一列表示月,还有一列表示日。因为我想使用日期比较,所以需要将它们作为日期格式的标准单列。 例如: 想要的结果是日期采用yyyy-mm-dd格式。到目前为止,我已经搜索并找到了一些解决方案,但我无法使它们工作-在Oracle中不工作,第二个是更数学的解决方案: select (2011-1900)*10000 +1*100 +1 (date) from dual; 给出错误:ORA-00936:缺少表达式 我能做些什么来达到预期的结果?如果不使

我有一个以不同方式保存日期的表,三列,一列表示年,另一列表示月,还有一列表示日。因为我想使用日期比较,所以需要将它们作为日期格式的标准单列。 例如:

想要的结果是日期采用
yyyy-mm-dd
格式。到目前为止,我已经搜索并找到了一些解决方案,但我无法使它们工作-在Oracle中不工作,第二个是更数学的解决方案:

select (2011-1900)*10000 +1*100 +1 (date) from dual;
给出错误:
ORA-00936:缺少表达式


我能做些什么来达到预期的结果?如果不使用数学,可能还有其他解决方案吗?

您不应该针对日期格式,而应该针对日期类型。格式只是在显示器上显示此类日期的一种方式,但日期类型最容易用于日期计算和比较

因此,假设您的三个列都是字符串类型,并且始终具有填充的零,如示例中所示(即一月为
01
而非
1
),您可以执行以下操作:

select to_date(year || month || day, 'YYYYMMDD') from dual 
如果列是数字:

select to_date(to_char(year, 'FM0000') || to_char(month, 'FM00')
            || to_char(day, 'FM00'), 'YYYYMMDD') from dual 
select to_char(year, 'FM0000') || '-' || to_char(month, 'FM00')
                               || '-' || to_char(day, 'FM00') from dual 
如果确实需要直接从三个值计算文本格式:

select year || '-' || month || '-' || day from dual 
同样,如果列是数字的:

select to_date(to_char(year, 'FM0000') || to_char(month, 'FM00')
            || to_char(day, 'FM00'), 'YYYYMMDD') from dual 
select to_char(year, 'FM0000') || '-' || to_char(month, 'FM00')
                               || '-' || to_char(day, 'FM00') from dual 

您不应以日期格式为目标,而应以日期类型为目标。格式只是在显示器上显示此类日期的一种方式,但日期类型最容易用于日期计算和比较

因此,假设您的三个列都是字符串类型,并且始终具有填充的零,如示例中所示(即一月为
01
而非
1
),您可以执行以下操作:

select to_date(year || month || day, 'YYYYMMDD') from dual 
如果列是数字:

select to_date(to_char(year, 'FM0000') || to_char(month, 'FM00')
            || to_char(day, 'FM00'), 'YYYYMMDD') from dual 
select to_char(year, 'FM0000') || '-' || to_char(month, 'FM00')
                               || '-' || to_char(day, 'FM00') from dual 
如果确实需要直接从三个值计算文本格式:

select year || '-' || month || '-' || day from dual 
同样,如果列是数字的:

select to_date(to_char(year, 'FM0000') || to_char(month, 'FM00')
            || to_char(day, 'FM00'), 'YYYYMMDD') from dual 
select to_char(year, 'FM0000') || '-' || to_char(month, 'FM00')
                               || '-' || to_char(day, 'FM00') from dual 

查找最新功能3列的数据类型是什么?@trincot数据类型是所有3列的数字您应该修复该设计并将该信息直接存储在单个
日期
列中。@a_horse_,带有\u no_名称,这不是我的设计)查找最新功能3列的数据类型是什么?@trincot数据类型是数字所有3个你应该修复这个设计,并将信息直接存储在一个
DATE
列中。@a_horse_,没有名字,这不是我的设计)FM000 FM00是什么意思?列存储在
TO_CHAR
中使用的数字数据格式中,该格式描述了
0
格式模型和
FM
格式模型修饰符。FM000 FM00的含义是什么?列存储在
TO_CHAR
中使用的数字数据格式中,该格式描述了
0
格式模型和
FM
格式模型修饰符。