繁体   English   中英

了解Oracle的to_date / to_char

[英]Understanding Oracle's to_date / to_char

因此,我正在为自己做一些练习,并按照以下说明为自己提供了一种状态:(我在医院使用他们的测试数据库)显示:

  1. Lname, Fname, Mname, Birth_date, Chief_Complaint, DTTM_ADM (日期/时间允许)
  2. 那么我的搜索将仅在20082010 DTTM_ADM之间
  3. 主要投诉将由用户手动输入。

我知道如何显示我给自己的第一条和第二条指令,但是我很难执行第二条指令。 我对SQL及其其他功能了解不多(这就是为什么要这样做的原因,以供学习)。

我的老师告诉我执行to_char函数来解决我的#2指令。 由于我只是在几年之间限制搜索(在他们的系统中,就像01-JUL-14 )。

所以我的问题是,如何以一种我只需要指示我的搜索方式来进行to_char或to_date操作,就只能以年为单位,并且没有沿限制的日期和月份(而不是说sql 01-JUL-14 ,那将是2014)

Table:
PATIENT_ADM A,
PATIENT_ADM B
A.DTTM_ADM > 2008
B.DTTM_ADM < 2010

如何正确执行此操作? (当您只能有限地访问某些网站并且网速非常慢时,很难进行OJT)

您可以通过2种方法来做到这一点,

  1. 您可以使用TO_CHAR进行年度比较,如下所示:

    PATIENT_ADM A, PATIENT_ADM B TO_CHAR(A.DTTM_ADM,'YYYY') > '2008' AND TO_CHAR(B.DTTM_ADM, 'YYYY') < '2010'

    说明 ,To_Char用于将日期转换为特定的字符串格式,例如,仅日期,仅月份,仅年份,仅小时或带有日期秒的年月年等。请参考文档链接中的答案。

  2. 您可以使用EXTRACT选项进行年度比较,如下所示

    PATIENT_ADM A, PATIENT_ADM B EXTRACT(YEAR FROM A.DTTM_ADM) > 2008 AND EXTRACT(YEAR FROM B.DTTM_ADM) < 2010

    说明 :提取用于从日期字段中提取特定的日期/时间部分值。 当您的数据库中有大量数据时,这特别有用,因为与EXTRACT相比,TO_CHAR的操作成本稍高。 请参阅随附的原始文件。

试试这样的WHERE子句:

WHERE A.DTTM_ADM >= TO_DATE('01-JAN-2008', 'DD-MON-YYYY') AND
      A.DTTM_ADM <  TO_DATE('01-JAN-2011', 'DD-MON-YYYY')

一些注意事项:-

  • 我假设DTTM_ADM的类型为DATE
  • 另一种方法是在DTTM_ADM上使用TO_CHAR ,但这将使Oracle无法使用该列上的索引
  • 第一个条件是大于或等于,以防某人在2008年1月1日午夜正确入场。
  • 第二个条件小于,因此,如果某人于2011年1月1日午夜被录取,则不将其包括在结果中

我将在您的where子句上使用extract()

EXTRACT()从时间戳类型或DATE中提取并返回年,月,日,时,分,秒或时区。

SELECT *
FROM PATIENT_ADM A, PATIENT_ADM
WHERE EXTRACT(YEAR FROM A.DTTM_ADM) > 2008
AND EXTRACT(YEAR FROM B.DTTM_ADM) < 2010;

首先确定DTTM_ADM是date类型还是varchar2或char这样的字符类型。 它应该是一个日期,但是正如您所说的“在他们的系统中,它就像01-JUL-14”,他们可以将其存储在字符串中。

函数to_char在日期上有效。 to_char(DTTM_ADM,'yyyy')会以字符串形式表示年份(例如'2009')。

如果DTTM_ADM恰好是字符串类型,则to_char没有用。 您将需要字符串函数SUBSTR来获取包含年份的子字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM