NEXT_DAY 函数

NEXT_DAY 函数返回晚于它的第一个 DATE 或 DATETIME 参数的最早的日期,并落在它的第二个参数指定的星期几上。第二个参数是三个 ASCII 字符的加引号的字符串,是星期几的英文名称缩写。

NEXT_DAY 函数需要两个参数:
  • 求值为早于该返回值的日期的 DATE 或 DATETIME 表达式。
  • 至少三个 ASCII 字符的字符串,对应于取值范围从 ASCII 65 至 ASCII 90 的大写字母。这三个字母编码为星期几的英文名称缩写。
成功地执行此函数,返回满足两个条件的最早的日历日期:
  • 该日期晚于第一个参数指定的日期。
  • 该日期落在第二个参数指定的星期几上。
NEXT_DAY 接受下列星期几的缩写字符串:
表 1. 作为 NEXT_DAY 函数的有效参数的星期几的缩写
星期 缩写   星期 缩写
星期日 'SUN'   星期三 'WED'
星期一 'MON'   星期四 'THU'
星期二 'TUE'   星期五 'FRI'
      星期六 'SAT'

忽略跟在这些缩写字符串的第三个字符之后的任何字符。例如,对于第二个参数,'MONDAY''MONTAG' 都是有效的规范,每一都指定在第一个参数的日期之后的星期一。然而,如果第二个字符串的前三个字符不与上表中星期缩写之一相匹配,比如 'MODNAY', 则 GBase 8s 发出错误。

例如,下列查询包括有效的 NEXT_DAY 表达式:
SELECT ship_date, NEXT_DAY(ship_date, 'SAT') AS next_saturday,
          NEXT_DAY(ship_date, 'SAT') - ship_date AS num_days FROM orders;
        
此查询的结果集可能包括来自 orders 表的下列数据:
ship_date  next_saturday    num_days
          
          06/01/2006 06/03/2006              2
          02/12/2007 02/17/2007              5
          05/31/2007 06/02/2007              2
          05/23/2007 05/26/2007              3
        

NEXT_DAY 返回的值与第一个参数有相同的数据类型。如果此参数为 DATE 类型,则 NEXT_DAY 返回 DATE 值。如果第一个参数为 DATETIME 类型,则 NEXT_DAY 返回 DATETIME YEAR TO FRACTION(5) 值。

由于在前面示例中的 ship_date 是 DATE 列,所以返回的日期格式化为 DATE 值,而不是 DATETIME 格式。

如果您使用主变量来存储 NEXT_DAY 的参数,但在准备时刻不知道该参数的数据类型,则 GBase 8s 假设该数据类型为 DATETIME YEAR TO FRACTION(5)。如果在运行时刻,在已准备了该语句之后,用户为主变量提供 DATE 值,则发出错误 -9750。要避免这种错误,请使用强制转型来指定该主变量的类型,如此程序片段中所示:
sprintf(query, ", 
          "select next_day(?::date, 'SUN') from mytab");
          EXEC SQL prepare selectq from :query;
          EXEC SQL declare select_cursor cursor for selectq;
          EXEC SQL open select_cursor using :hostvar_date_input;
          
          EXEC SQL fetch select_cursor into :var_date_output;