我需要以这种方式构造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
。
答案 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>