我目前正在开发一个项目,其行为会有所不同,具体取决于是否是公共假期(显然还有其他限制因素)。为此,我正在尝试创建一个包含日期和一周中某一天的表格(将“假日”视为本周的第八天')。
我有一张表我正在寻找假期列表,名为holiday
,其中只有一个字段holidaydate
(DATE
数据类型)。我正在尝试将值放入的表名为daydates
,包含两个字段day
(DATE
数据类型)和dayofweek
(CHAR(10)
数据类型)
这是我现在所拥有的逻辑,而我正在测试。
INSERT INTO holiday
(holidaydate)
SELECT sysdate FROM dual;
SELECT sysdate,
(
CASE
WHEN sysdate IN
(SELECT h.holidaydate FROM holiday h)
THEN 'holiday'
ELSE TO_CHAR(sysdate , 'day')
END)
FROM dual;
不幸的是,它目前正在返回,比如“周三”,而不是“假期”。我有一种感觉,我需要将WHEN sysdate IN
更改为WHEN to_char (sysdate, 'dd-mon-yyyy') IN
或类似的东西,但我尝试了一些变化,但它们似乎没有效果到目前为止。
有什么建议吗?
答案 0 :(得分:5)
我认为你的问题是它几乎永远不会达到这种情况:
CASE
WHEN sysdate IN
(SELECT h.holidaydate FROM holiday h)
因为,当您将 SYSDATE 插入假期表时,会插入日期和时间信息。所以你提到的情况几乎从未执行过。
尝试仅比较案例中日期的重要部分。
CASE
WHEN TRUNC(SYSDATE) IN (SELECT TRUNC(h.holidaydate) from holiday h)
它应该有用。
答案 1 :(得分:2)
在您的假期表中,您只对日期而不是时间组件感兴趣。施加约束来强制执行此操作并阻止任何人犯同样的错误:
CREATE TABLE HOLIDAY
(holidaydate DATE NOT NULL
CONSTRAINT DateOnlyNoTime
CHECK (holidayDate = TRUNC(holidayDate)));
毫无疑问,您需要主键和其他一些列。
删除日期的日期/时间部分的首选方法是出于性能原因使用上述TRUNC()而不是TO_DATE()。您的示例查询将变为:
SELECT sysdate,
(
CASE
WHEN TRUNC(sysdate) IN
(SELECT h.holidaydate FROM holiday h)
THEN 'holiday'
ELSE TO_CHAR(sysdate , 'day')
END)
FROM dual;
答案 2 :(得分:0)
你要求提出建议......
sysdate
(例如使用常量)来查看是否是导致问题的原因?