-1

当确定日期在一周中的特定日期时,我试图进入 PLSQL 中的 if 条件。

DECLARE
  v_gebDatum    CONSTANT     DATE                 := to_date('21-01-1995', 'dd-MM-yyyy');
  v_mathDatum                DATE                 := v_gebDatum;
  v_huidigeDag               VARCHAR2(20);

  v_teller                   number   := 0;
BEGIN
  WHILE to_char(v_mathDatum, 'yyyy') < to_char(sysdate, 'yyyy')
  LOOP
    v_mathDatum := add_months(v_mathDatum, 12);
    v_huidigeDag := to_char(v_mathDatum, 'DAY');
    dbms_output.put_line(v_huidigeDag);
    IF v_huidigeDag IN('ZATERDAG', 'ZONDAG')
    THEN
      dbms_output.put_line(v_mathDatum);
    END IF;
  END LOOP;
END;

问题是我无法让它工作。打印 v_huidigeDag 时,它在某些打印行中清楚地具有值“ZATERDAG”和“ZONDAG”。

看来,由于某种原因,当我打印日期名称的值时,程序会在其中添加空格。我猜它需要我的语言环境中最长的日期名称('DONDERSDAG')的字符长度。并且所有字符少于它添加空格的字符。所以 zaterdag 变为 = 'ZATERDAG' 并且 zondag 变为 = 'ZONDAG'。现在它正在工作,但有人知道防止这种情况的简单方法吗?

4

1 回答 1

1

问题出在DAY格式上。根据日期格式文档

日期名称,用空格填充以显示该元素使用的日期语言中最宽的日期名称的宽度。

要禁用该行为,您必须使用FM修饰符

调频

在 TO_CHAR 函数的日期时间格式元素中,此修饰符在日期格式模型中抑制后续字符元素(例如 MONTH)中的空白并抑制后续数字元素(例如 MI)中的前导零。如果没有 FM,字符元素的结果总是用空格向右填充到固定长度,并且总是为数字元素返回前导零。使用抑制空白填充的 FM,返回值的长度可能会有所不同

在您的特定情况下:

    v_huidigeDag := to_char(v_mathDatum, 'fmDAY');
于 2014-11-29T14:01:37.223 回答