【问题标题】:PL/SQL Check if SYSDATE is between two DATETIMES "HH24:mi"PL/SQL 检查 SYSDATE 是否在两个 DATETIMES "HH24:mi" 之间
【发布时间】:2015-08-24 18:43:50
【问题描述】:

我正在尝试创建一个函数来检查我的 sysdate 是否介于 HH24:mi 上的两个数据之间。如果这是真的,那么如果它不返回 0,它需要返回 1。

我试过这个但没有成功:Check if current date is between two dates Oracle SQL

这是我使用的代码:

create or replace FUNCTION WinkelOpen(winkelID Number)
  RETURN NUMBER
IS
  CURSOR c_tijden_t(v_temp_winkelID IN NUMBER, v_temp_dag IN VARCHAR2) IS
        SELECT * FROM Openingstijd
        WHERE winkel_id = v_temp_winkelID
        AND dag = v_temp_dag;

  TYPE a_array_days IS VARRAY(7) OF VARCHAR2(2);
    v_dagen a_array_days := a_array_days('ma', 'di', 'wo', 'do', 'vr', 'za', 'zo');    

  v_temp_suc  NUMBER;
  v_isClosed Number(1,0) := 0;


BEGIN
  FOR i IN c_tijden_t(winkelID, v_dagen(to_char (SYSDATE, 'D')-1)) LOOP

    select * INTO v_temp_suc from dual 
    WHERE trunc(sysdate) 
    BETWEEN TO_DATE(i.open, 'HH24:mi') 
    AND TO_DATE(i.gesloten, 'HH24:mi');

    --if v_temp_suc is 0 then keep looping
    --else v_isClosed = 1 break loop

    END LOOP;
    RETURN v_isClosed;
END WinkelOpen;

【问题讨论】:

  • 但是您将苹果与橙子进行比较。 sysdate 有日期+时间信息。您要检查的 2 个日期只有时间信息。当然,这是行不通的。编辑:实际上,更糟糕的是:您正在从 sysdate.xml 中删除时间信息。因此,您实际上是将日期与 2 次进行比较。这没有意义!!!
  • is between 2 datas on the HH24:mi 是什么意思?可以举个例子吗?
  • 例如我的 Sysdate 是:18:00,两次是 17:00 和 19:00。我的 sysdate 现在介于两个日期之间。
  • @Kevin:不。您的系统日期将类似于“6 月 9 日 18:00”。而且因为您正在对其进行TRUNC,所以它只会是“6 月 9 日@午夜”。您的 2 个日期,因为它们没有任何日期部分,当转换为日期时,将默认为“6 月 1 日 17:00”和“6 月 1 日 19:00”。他们根本不在同一个球场。苹果和橙子。
  • @sstan 如果我删除“TRUNC”,它仍然是苹果和橙子。

标签: sql oracle plsql


【解决方案1】:

在日期上使用 TRUNC 会将其设置为当天的 00:00。我假设你在这里追求的是“检查现在是否在 X 和 Y 之间”。就像米克说的那样,以下应该是好的:

SELECT count(*) INTO v_temp_suc FROM dual 
WHERE to_char(sysdate, 'HH24:MI') 
BETWEEN i.open AND i.gesloten;

但您还需要注意,您可能会遍历游标中的多个结果。您可能会获得任意数量的点击,但它只会返回最后一个的结果。您已注释掉光标的伪代码部分。但是你不要忘记添加

IF v_temp_suc != 0 THEN
  EXIT;
END IF;

另外 - 根据您使用的输入类型(例如用户输入),您可能会发现他们有时会先输入较晚的时间,而有时会先输入较早的时间。如果您遇到奇怪的结果,请注意这一点

含义:IF(2 介于 1 和 3) 给出 TRUE,但 IF(2 介于 3 和 1) 给出 FALSE。

【讨论】:

    【解决方案2】:

    假设i.openi.gesloten 中的数据格式为HH24:MI10 之前的几小时是零填充的),您可以在您的过程中使用此查询:

    SELECT count(*) INTO v_temp_suc FROM dual 
    WHERE to_char(sysdate, 'HH24:MI') 
    BETWEEN i.open AND i.gesloten;
    

    查询将返回01,具体取决于(数据库的)当前时间是否在时间间隔内。

    【讨论】:

      【解决方案3】:

      根据您帖子下方的cmets,您说您在比较时只对时间部分感兴趣。所以在这种情况下,你也许可以这样做:

      select * INTO v_temp_suc from dual 
      WHERE sysdate
      BETWEEN TO_DATE(to_char(sysdate, 'YYYY-MM-DD ') || i.open, 'YYYY-MM-DD HH24:MI') 
      AND TO_DATE(to_char(sysdate, 'YYYY-MM-DD ') || i.gesloten, 'YYYY-MM-DD HH24:MI');
      

      这假定i.openi.geslotenvarchars,并且它们确实被格式化为HH24:MI

      我确信有更好的方法可以做到这一点,但这至少应该有效。

      【讨论】:

        猜你喜欢
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-31
        相关资源
        最近更新 更多