【问题标题】:display details of employees who joined in first march of each year [closed]显示每年 3 月 1 日加入的员工的详细信息 [关闭]
【发布时间】:2021-12-30 13:58:48
【问题描述】:

在我的 Oracle 数据库中,我有一个表 employees,其中包含数千条记录。 它有列:

  1. employee_id
  2. first_name
  3. last_name
  4. email
  5. salary
  6. hire_date

我想在每个月的23March 的第几天向加入 hire_date 的员工展示。

但是,当使用下面的 SELECT 语句时,它只显示空记录。

SELECT FIRST_NAME,LAST_NAME,EMAIL
FROM EMPLOYEES
WHERE to_char(hire_date, 'mon')='dec'
   AND to_char(hire_date, 'DD')='23';

尝试显示记录,但未显示。显示特定记录的日期和月份的正确格式应该是什么。

【问题讨论】:

  • 我试过了,但没有显示结果。它显示空白记录。
  • 1) “空白记录”与“空记录”一样无济于事——有没有结果? 2) 您的文本提到 March,但您的查询提到 dec。 3) 你确定表中有应该匹配这个查询的行吗?
  • ????????请解决您的问题:(a)first march 如标题,或(b)23 March 如文本,否则(c)23 december 如 SQL。以此为培训:一致性和专注力将帮助您在未来成为开发人员。

标签: sql oracle


【解决方案1】:

ANSI/ISO SQL 解决方案是EXTRACT():

SELECT FIRST_NAME, LAST_NAME, EMAIL
FROM EMPLOYEES
WHERE extract(day from hire_date) = 23
  AND extract(month from hire_date) = 3

【讨论】:

  • 有趣的事实和文档:Oracle 的 EXTRACT(datetime) 文档有一个使用表 employees 的示例 ?
【解决方案2】:

首先,在您的问题中,您说您正在寻找 3 月 23 日的员工,但在示例查询的 where 子句中,您正在搜索 12 月 23 日雇用的员工。

为了防止不同语言中月份的任何拼写不同,并在 where 子句中使用一个过滤器而不是两个过滤器进行比较,您可以使用类似这样的查询。

SELECT FIRST_NAME, LAST_NAME, EMAIL
  FROM EMPLOYEES
 WHERE TO_CHAR (hire_date, 'MMDD') = '0323';

【讨论】:

  • (to_char(hire_date , 'mmdd'='0323'; 有效
【解决方案3】:

Oracle 的 to_char 函数使用 DATE 类型的列 hire_date 作为参数正确应用,formats models DD 表示 day-of-month

顺便说一句,PostgreSQL 和 MySQL 也支持这个具有大多数格式文字(至少 DDMON)的函数。

可能的问题:使用缩写的月份名称

我想知道 月份缩写名称mon 是否正常工作。 至少月份的右侧是一个问题,因为小写 dec 而不是大写 DEC。还要注意用于格式化月份名称的 locale。在英语语言环境中DEC for December 应该可以工作。

对于问题中所述的March 月份,您将使用'MAR' 作为月份比较的右侧(而不是DEC)。

简化

更简单的方法是使用组合格式,例如 TO_CHAR(hire_date, 'DD-MON') = '23-DEC',分别使用数据库区域设置中的月份缩写。

使用 group-by 和 count 进行测试

SELECT TO_CHAR(hire_date, 'DD-MON') as hired_day, COUNT(*)
FROM employees
GROUP BY TO_CHAR(hire_date, 'DD-MON')
WHERE TO_CHAR(hire_date, 'DD') = '23'

应该返回日期和月份(以您的区域设置格式)以及雇用员工的数量 - 对于所有记录的月份限制为 23 日(结果集中最多 12 行)。

您还可以省略带有WHERE 条件的最后一行以获取所有日期,从而得到更长的列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 2020-10-08
    • 2016-06-24
    • 1970-01-01
    相关资源
    最近更新 更多