【问题标题】:Is there any function to substract date in SQL是否有任何函数可以在 SQL 中减去日期
【发布时间】:2019-07-31 13:08:28
【问题描述】:

我需要从员工雇用日期中减去几个月

员工入职日期 = 2018 年 8 月 12 日

以前的经验 = 0.92(即 11 个月)

我想要像这样的计算

入职日期 - 以前的经验 = 新入职日期

这个有什么功能吗?

【问题讨论】:

    标签: sql oracle date difference


    【解决方案1】:

    您正在使用add_months 函数。

    这接受两个参数:日期和您尝试添加的月数。

    如果您将负数作为第二个参数传入,您将减去月份。

    例如:

    select to_date('23/07/2019', 'dd/mm/yyyy') dt,
           add_months(to_date('23/07/2019', 'dd/mm/yyyy'), -1) prev_month_dt
    FROM   dual;
    
    DT          PREV_MONTH_DT
    ----------- -------------
    23/07/2019  23/06/2019
    

    【讨论】:

    • 在查询下方尝试但输出错误 select to_char(add_months('10/12/2018', - 9.2 * 12),'dd/mm/yyyy') from dual output 20/10/0001
    • 您应该使用to_date 将字符串转换为日期;相反,您的字符串正在使用您的 NLS_DATE_FORMAT 参数作为格式掩码进行隐式转换,这可能就是您得到错误年份的原因。你想要select to_char(add_months(to_date('10/12/2018', 'dd/mm/yyyy'), - 9.2 * 12), 'dd/mm/yyyy') from dual; 如果你传递给 add_months 的值已经是 DATE 数据类型(例如你传递一个变量或列名),你不需要将它转换为日期,因为它已经在正确的数据类型。
    • 如果您只对日期感到满意,在 Oracle 中可以将日期常量指定为 date '2018-12-10'
    【解决方案2】:

    您可以尝试从雇用日期中减去那么多天:

    SELECT
        date_hire,
        date_hire - 365*exp AS hire_date_new
    FROM yourTable;
    

    这假设一年是 365 天,这并不严格,因为闰年​​有 366 天。希望您不会介意提前或稍晚雇用某人。

    【讨论】:

    • 在查询下尝试但输出错误 select to_char(add_months('10/12/2018', - 9.2 * 12),'dd/mm/yyyy') 从双输出:20/10/0001
    • @Abhijitjadhav 你正在运行别人的答案:-) ...我建议从雇用日期中减去天数。
    【解决方案3】:

    您可以使用add_months() 添加一年的小数部分:

    select add_months(hiredate, - prev_exp * 12)
    

    或转换为天数:

    select hiredate - 365 * prev_exp
    

    【讨论】:

    • 在查询下尝试但输出错误 select add_months('10/12/2018', - 0.92 * 12) from dual output : 0010-01-20 18:00
    • @Abhijitjadhav 。 . .将日期表示为date '2018-10-12'
    猜你喜欢
    • 2021-03-15
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多