Sql 用多个字符替换字符

Sql 用多个字符替换字符,sql,oracle,Sql,Oracle,在我的应用程序中,日期格式是可配置的,并以以下格式之一存储在表中: d.m.Y --> represents dd.mm.rrrr d.m.y --> represents dd.mm.rr Y.m.d --> represents rrrr.mm.dd y.m.d --> represents rr.mm.dd 我需要在我的查询和过程中使用它以用户指定的格式显示日期,这可以通过to\u CHAR(任意日期,日期格式) 但是,我需要将这些值转换为Oracle可以识别的格

在我的应用程序中,日期格式是可配置的,并以以下格式之一存储在表中:

d.m.Y --> represents dd.mm.rrrr
d.m.y --> represents dd.mm.rr
Y.m.d --> represents rrrr.mm.dd
y.m.d --> represents rr.mm.dd
我需要在我的查询和过程中使用它以用户指定的格式显示日期,这可以通过
to\u CHAR(任意日期,日期格式)

但是,我需要将这些值转换为Oracle可以识别的格式

目前,我正在使用
REPLACE
实现以下目标:

TO_CHAR(<my_date_column>, REPLACE(
                            REPLACE(
                                REPLACE(
                                    REPLACE('<date_format>', 
                                            'd', 'dd'), 
                                        'm', 'mm'), 
                                    'Y', 'rrrr'), 
                                'y', 'rr'))
到字符(,替换(
替换(
替换(
替换(“”,
‘d’、‘dd’,
‘m’、‘mm’,
‘Y’、‘rrrr’,
"y","rr")

我很想知道是否还有其他方法可以做到这一点。可能正在使用
REGEXP\u REPLACE
或其他方法。

您应该先查看表中列的定义。它是日期类型字段、数字字段还是varchar2字段

如果任何_日期为日期格式,则可以使用to_char: 致char(任何日期'd.m.Y')

如果字段中的任意_日期是数字(8,0)格式,则需要理解数字格式并将其转换为字符。假设任何一个日期都是一个数字YYYYMMDD,那么 使用to_char(任意日期)获取数字YYYYMMDD。
如果任何_日期的数字格式为YYYYMMDD,并且您希望它为d.m.Y,则最好将数字转换为字符,然后转换为日期,然后再转换回字符: to_char(to_date(to_char,任意日期),'yyyyymmdd','d.m.Y')

如果日期是varchar2格式,那么最好的选择是转换为日期格式并转换回varchar2:
to_char(to_date(任何日期),“”)

您是否可以选择使用解码

TO_CHAR(<my_date_column>, decode(<date_format>, 'd.m.Y', 'dd.mm.rrrr'
                                              , 'd.m.y', 'dd.mm.rr'
                                              , 'Y.m.d', 'rrrr.mm.dd'
                                              , 'y.m.d', 'rr.mm.dd'))
TO_CHAR(,decode(,'d.m.Y','dd.mm.rrrrrr'
“d.m.y”、“dd.mm.rr”
“Y.m.d”、“rrrr.mm.dd”
,y.m.d.,rr.mm.dd'))

除了您在问题中列出的4种格式之外,还有其他可能的格式吗? 如果不是,VBokšić的解码是一个有效答案

你的替代品也是硬编码的


我建议不要存储用户输入的格式(无论是文本值
19.09.19
还是使用的格式
dd.mm.rr
):让用户界面处理解释并存储真实日期。将API与数据模型分离。

“如果有其他方法可以做到这一点”,您的意思是除了使用Oracle内置NLS设置之外,还可以在会话级别或客户端进行配置?如果您不能一开始就使用Oracle的格式,我建议创建一个表来存储从您的格式到Oracle格式的翻译。例如,“d.m.Y”->“dd.mm.rrrr”。您的代码将更短、更灵活(例如,您可以通过更改数据而不是更改代码向翻译中添加时间组件)。不,不允许创建表,我只需要知道是否有其他方法可以创建表。我想用regexp_替换来实现同样的效果。但是不知道如何使用它。你是说一个
regexp\u替换
?我的意思是,当然你可以使用其中的4个,但这基本上与使用常规的旧
replace
是一样的。用一个
regexp\u replace
来做这件事将是一个有趣的智力练习,但我会向将类似东西投入生产的开发人员开枪!是的,单个regexp_replaceMy date列的日期类型不是number或varchar2。为什么不能创建一个视图并在代码中使用它呢。无论如何,显示格式化日期的代码必须驻留在应用程序端,而不是数据库中,因为Oracle不以任何格式存储日期。它使用
type12
type13
数据类型来存储日期