当前位置: 首页 > 知识库问答 >
问题:

日期类型上查询substr的索引是什么?

汪典
2023-03-14

嗨,我想做一个查询,以打印用户在ORACLE上的特定月份做一个动作SQL开发者。

以下是表格:

CREATE TABLE USUARIO2 (
    CODIGO NUMBER(10) CONSTRAINT USUARIO_PK PRIMARY KEY,
    NOMBRE VARCHAR(50) CONSTRAINT NOM_USUARIO_NN NOT NULL,
    TELEFONO VARCHAR2(12),
    DIRECCION VARCHAR2(100)
);

CREATE TABLE SACA (
    COD_USUARIO NUMBER(10),
    COD_EJEMPLAR NUMBER(10),
    FECHA_PRES DATE DEFAULT SYSDATE,
    FECHA_DEV DATE,
    CONSTRAINT SACA_PK PRIMARY KEY (COD_USUARIO, COD_EJEMPLAR, FECHA_PRES),
    CONSTRAINT USUARIO_FK FOREIGN KEY (COD_USUARIO) REFERENCES USUARIO2(CODIGO) ON DELETE CASCADE,
    CONSTRAINT EJEMPLAR_FK FOREIGN KEY (COD_EJEMPLAR) REFERENCES EJEMPLAR(CODIGO) ON DELETE CASCADE
);

以下是SACA的价值观:

INSERT INTO SACA VALUES (123,778899, '01-01-2017','02-05-2017');
INSERT INTO SACA VALUES (123,112233, '01-01-2017','02-05-2017');
INSERT INTO SACA VALUES (234,882143,'04-01-2017','04-07-2017');
INSERT INTO SACA VALUES (234,777722,'04-01-2017','04-07-2017');
INSERT INTO SACA VALUES (345,976543, '01-01-2017','02-05-2017');
INSERT INTO SACA VALUES (456,446733,'04-01-2017','04-07-2017');
INSERT INTO SACA VALUES (567,778899, '01-01-2017','02-05-2017');
INSERT INTO SACA VALUES (890,222266,'04-01-2017','04-07-2017');

这就是查询。我想从FECHA\u DEV(代码)栏查询获得特定月份(05)书籍的用户。以下是查询:

SELECT usuario2.nombre
FROM usuario2
JOIN saca ON usuario2.codigo=saca.cod_usuario WHERE SUBSTR(FECHA_DEV,3,5) IN ('05');

查询为空,但如果更改了值,并从第一个和最后一个位置进行询问,则会正常工作。

那么,日期格式的月份索引是什么?

共有3个答案

子车修平
2023-03-14

SUBSTR中,最后一个参数是从第二个参数定义的位置开始的长度

WHERE SUBSTR(FECHA_DEV, 3, 2) IN ('05'); -- changed 5 to 2

但是,您可以使用提取:

WHERE extract(month FROM FECHA_DEV) = 5
松旻
2023-03-14

那么,日期格式的月份索引是什么?

这个问题的前提是有缺陷的,因为DATE是无格式的,因为它在内部存储为7个字节(分别为:世纪、世纪之年、月、月中日、小时、分钟和秒),所以没有DATE数据类型的通用字符串表示。

SUBSTR(string,start\u character,length)函数采用:

  • 字符串作为其第一个参数

因此,第一个错误是,如果假设格式为DD-MM-RR,并且需要一个从字符串的第四个字符开始的2个字符长的子字符串,那么第二个和第三个参数应该是4,2,而不是3,5。

当您将DATE作为第一个参数传递时,Oracle将做的第一件事是尝试将DATE隐式转换为字符串,并且您的函数调用有效地:

SUBSTR(
  TO_CHAR(
    fecha_dev,
    ( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
  ),
  4,
  2
)

默认的NLS_DATE_FORMAT取决于NLS_TERRITORY设置,因此您不会在世界不同地区的用户之间获得一致的值(即在西班牙,默认为DD/MM/RR,而在美国是DD-MON-RR,月份显示为字符,在瑞典是RRRR-MM-DD,获取第4和第5个字符将给出最后一年的数字和连字符)。

即使您的用户都在同一个区域内,也不能保证他们不会设置自己的会话参数,因为任何用户都可以发出命令来更改他们的会话以进行更改。例如:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD HH24MISS MONRR';

(是的,这种日期格式确实在某些设置中使用)

因此,您永远不应该依赖日期到字符串的隐式转换,因为您无法确定是否会获得一致的格式。

如果确实要使用SUBSTR,则应显式地将日期转换为字符串,并指定格式模型:

WHERE SUBSTR( TO_CHAR( fecha_dev, 'DD-MM-RR' ), 4, 2 ) IN ( '05' )

但是,如果要这样做,可以跳过SUBSTR,只输出月份:

WHERE TO_CHAR( fecha_dev, 'MM' ) = '05'

或者您可以使用提取:

WHERE EXTRACT( MONTH FROM fecha_dev ) = 5
喻珂
2023-03-14

我假设是Oracle,因为使用了number数据类型和sysdate引用。

不要对日期值使用字符串函数。它将在某一点或另一点失败(例如,在我的计算机上,SUBSTR(sysdate,3,5)返回-MAR-而不是03)。

最好将月份提取为数字。

因此,要获取5月份FECHA\u DEV所在的所有行,您应该使用:

SELECT usuario2.nombre
FROM usuario2
   JOIN saca ON usuario2.codigo=saca.cod_usuario 
WHERE extract(month from FECHA_DEV) = 5;

上述内容需要如下索引:

create index idx_fecha_dev_month on SACA  ( extract(month from FECHA_DEV)  );

是否使用该指数是另一个问题。您必须检查执行计划以进行验证。

 类似资料:
  • 我们在各种搜索应用程序中使用solr索引。在大多数情况下,我们使用它就像您使用管理界面一样。例如: 这个很好用 我的问题是,在一个应用程序中,我们直接对索引使用复杂的lucene查询(不使用solr),在这些查询中,我找不到如何搜索日期字段 在模式中。xml: 看起来solr将日期存储为以毫秒为单位的unix时间,当从索引中提取字段时,它看起来1336867200000 在Lucene中,我尝试了

  • 我有一个大约为100GB的cosmos数据库。我成功地创建了一个漂亮的分区键,我在70M记录上有大约4600个分区,但是我仍然需要查询两个存储为字符串的日期时间字段,而不是纪元格式。 示例json: 我注意到当我做中选择*以及当我做

  • 当我跑步时 我明白了 有没有其他方法将字符串格式化为日期?或者我应该继续这样做并进行一些修改。我已经有2列数据类型varchar,日期的格式为(mm/dd/yyyy)。我需要在它们之间执行减法以获得天数。当它是varchar格式时,不能这样做。

  • 本文向大家介绍什么是索引?SQL Server 2000里有什么类型的索引?相关面试题,主要包含被问及什么是索引?SQL Server 2000里有什么类型的索引?时的应答技巧和注意事项,需要的朋友参考一下 任何有经验的数据库开发人员都应该能够很轻易地回答这个问题。一些经验不太多的开发人员能够回答这个问题,但是有些地方会说不清楚。简单地说,索引是一个数据结构,用来快速访问数据库表格或者视图里的数据

  • 我尝试创建一个查询,显示入住和退房日期之间的可用酒店。此外,当我为特定房间预订时,我将他们的预订列设置为1。这意味着,在现实生活中,当结账日期到来时,触发函数将该预订列设置成0。 如果酒店的所有房间都已预订(预订=1),并且这些房间的签入-退房日期是特定日期(签入-退房输入),则不要将该酒店放在列表中。我的查询不会显示我想要的结果。 查询:输入:国家(状态)、签入和签出。 当我运行查询时,它总是显

  • 问题内容: 如果索引是在类型列而不是类型列上设置(并且查询是在该列上进行的),则查询性能是否存在显着差异? 在我目前的设计中,我有2列: TINYINT(1),已 索引 约会时间 查询是 如果我改为在列上创建索引并运行这样的查询,会不会更慢? 问题答案: 这是一个具有1000万行的MariaDB(10.0.19)基准测试(使用sequence插件): 为了衡量我执行查询后使用和运行的时间。从概要分