我有一张有数据的桌子:
43 SQL Developer 2016-04-25/14:15:18
43 SQL Developer 2016-04-25/14:11:41
43 SQL Developer 2016-04-26/11:11:11我只想显示日期为25.04的行。我是regexp的新手,这个字符字符串像[]][]/。总是惹恼我。
发布于 2016-04-27 20:16:52
我的第一个倾向是做日期操作,但是由于这个问题是以REGEXP_LIKE的形式提出的,所以我假设OP想使用字符串操作:
将第3列转换为日期,然后提取月份=4和日期=25的位置:
with tbl(col1, col2, col3) as (
select 43, 'SQL Developer', to_date('2016-04-25/14:15:18', 'YYYY-MM-DD/HH24:MI:SS') from dual union
select 43, 'SQL Developer', to_date('2016-04-25/14:11:41', 'YYYY-MM-DD/HH24:MI:SS') from dual union
select 43, 'SQL Developer', to_date('2016-04-26/11:11:11', 'YYYY-MM-DD/HH24:MI:SS') from dual
)
select col1,
col2,
col3
from tbl
where EXTRACT(month FROM col3 ) = 4
and EXTRACT(day FROM col3 ) = 25; 使用REGEXP_LIKE:
with tbl(col1, col2, col3) as (
select 43, 'SQL Developer', '2016-04-25/14:15:18' from dual union
select 43, 'SQL Developer', '2016-04-25/14:11:41' from dual union
select 43, 'SQL Developer', '2016-04-26/11:11:11' from dual
)
select col1,
col2,
col3
from tbl
where regexp_like(col3, '04-25\/'); 这在很大程度上假设了存储在varchar2中的日期/时间列(可以说是个坏主意)。它总是以这种格式,不是NULL,分隔符总是斜杠,如果输入来自其验证和擦除的屏幕形式,以确保它与此格式相匹配,等等。您可能需要在日期/时间列上搜索意外格式,以确保您确实知道正在处理的是什么。因为它是一个varchar2,所以您真的无法确定(数据类型中存储日期的问题之一)。
我强烈建议您将此日期/时间存储在适当的日期列中,如果您有此权限,请省去一些麻烦。
编辑:您也可以通过使用此REGEXP_SUBSTR进行比较来收紧它。regex使其匹配整个行,特别是将捕获的月/日组与所需的组匹配。如果没有找到该模式,则返回NULL,因此通过将其包围在NVL中,该NVL返回“未找到的值”或任何适当的内容,例如:
where regexp_substr(col3, '^\d{4}-(\d{2}-\d{2})\/\d{2}:\d{2}:\d{2}$', 1,1,null,1) = '04-25';发布于 2016-04-26 13:59:05
如果要与日期(一个真正以日期时间格式表示的值)进行比较,无论它是来自数据库中的表的值,还是在运行时传入的绑定变量,还是任何其他类型的真正的“日期时间”tipe,您都可以这样进行比较:
... where to_date(substr(your_col, 1, instr(your_col, '/')-1), 'yyyy-mm-dd') = date_param在这里,your_col是您在问题中说明的列的名称(包含“看起来像”日期/时间的字符串),而date_param是您想要比较的日期。
Note -如果date_param可能有一个时间组件(除了00:00:00),您将需要在右边有trunc(date_param)。在左侧,您不需要trunc(),因为to_date使用我已经显示的方式给出了一个“截断”数据(默认情况下时间设置为00:00:00 )。
祝好运!
https://stackoverflow.com/questions/36861436
复制相似问题