在案例表达式中的日期中更改年份

时间:2019-01-14 06:42:27

标签: sql oracle case

我需要以这种方式构造WHERE子句:

  • 如果SysDate的月份为十二月,则所需的值应为01/12 00:00:00(12月1日午夜),而年份应为当年

  • 如果SysDate的月份是其他月份,则所需的值应为01/12 00:00:00(12月1日午夜),但< / strong>年份应为上一年

有问题的列是DATE类型。

例如,

  • 如果我将在14 December 2019上运行查询,则结果应为01/12/2019 00:00:00

  • 如果查询今天(14 January 2019开始运行,则结果应为01/12/2018 00:00:00

3 个答案:

答案 0 :(得分:1)

类似的东西:

  • 如果是十二月,我们要做的就是trunc吃到'month'14 Dec 2017 15:56:45.666-> 1 Dec 2017
  • 如果还有其他月份,我们可以在1 Jan的帮助下获得trunc,直到'year'减去一个月:{{1} }-> 14 Apr 2015 23:40:01.583-> 1 Jan 2015

演示查询:

1 Dec 2014

如果要将其与select case when extract(month from MyDate) = 12 then -- December trunc(MyDate, 'Month') else -- All the other months add_months(trunc(MyDate, 'Year'), -1) end as MyModifiedDate from MyTable 一起放在where中:

SysDate

答案 1 :(得分:0)

这是另一种方法,当我用sysdate对日期列(在我的示例中为someDate)进行补全时,我只查看年份

SELECT *
FROM TEST
WHERE CASE  
   WHEN EXTRACT(MONTH FROM SYSDATE) = 12 AND ((EXTRACT(YEAR FROM SYSDATE) + 1) = EXTRACT(YEAR FROM someDate)) THEN 1
   WHEN EXTRACT(MONTH FROM SYSDATE) <> 12 AND EXTRACT(YEAR FROM SYSDATE) = EXTRACT(YEAR FROM someDate) THEN 1
   ELSE 0
   END = 1

答案 2 :(得分:0)

您可以使用trunc()将日期截断为该年1月1日。

通过在日期前加上一个月然后将其截断,可以模拟出实际上是一月的十二月。因此,当您将其截断为年份时,它将从下一年开始提取年份。然后您需要减去一个月,以使日期恢复为正确的月。

例如:

WITH dates AS (SELECT to_date('01/11/2017', 'dd/mm/yyyy') + LEVEL -1 dt
               FROM   dual
               CONNECT BY LEVEL <= 500)
SELECT dt,
       add_months(TRUNC(add_months(dt, + 1), 'yyyy'), -1) yr
FROM   dates
ORDER BY dt;


DT          YR
----------- -----------
01/11/2017  01/12/2016
02/11/2017  01/12/2016
03/11/2017  01/12/2016
<snip>
29/11/2017  01/12/2016
30/11/2017  01/12/2016
-- year change here
01/12/2017  01/12/2017
02/12/2017  01/12/2017
03/12/2017  01/12/2017
<snip>
29/12/2017  01/12/2017
30/12/2017  01/12/2017
31/12/2017  01/12/2017
01/01/2018  01/12/2017
02/01/2018  01/12/2017
03/01/2018  01/12/2017
04/01/2018  01/12/2017
05/01/2018  01/12/2017
06/01/2018  01/12/2017
<snip>
26/11/2018  01/12/2017
27/11/2018  01/12/2017
28/11/2018  01/12/2017
29/11/2018  01/12/2017
30/11/2018  01/12/2017
-- year change here
01/12/2018  01/12/2018
02/12/2018  01/12/2018
03/12/2018  01/12/2018
04/12/2018  01/12/2018
05/12/2018  01/12/2018
06/12/2018  01/12/2018
<snip>
26/12/2018  01/12/2018
27/12/2018  01/12/2018
28/12/2018  01/12/2018
29/12/2018  01/12/2018
30/12/2018  01/12/2018
31/12/2018  01/12/2018
01/01/2019  01/12/2018
02/01/2019  01/12/2018
03/01/2019  01/12/2018
04/01/2019  01/12/2018
<snip>