在Informix中找到本周的第一天

时间:2015-11-18 20:55:21

标签: sql informix

如何在Informix SQL中选择本周的第一天?

2 个答案:

答案 0 :(得分:2)

Informix将星期日视为一周的第一天(数字0)。如果你想找到最近的星期天,那么这样就可以了:

SELECT TODAY - (WEEKDAY(TODAY)) UNITS DAY
FROM   systables
WHERE  tabid=1;

FROM子句是必需的,你可以根据你想要检索的其他内容放置另一个表。

答案 1 :(得分:0)

answer推广trincot,如果您希望一周的第一天是代码为N的那一天,则表达式应为:

date_col - MOD(7 + WEEKDAY(date_col) - N, 7)

显然,当N为0时,MOD表达式相当于WEEKDAY(date_col),因此结果与trincot相同。

例如,对于星期一(第1天)作为一周的第一天,对于2015年11月的日期(2015-11-01是星期日),我创建了一个表Date_List,其中包含一列{{1类型d并在2015年11月为每个插入一条记录。

DATE

结果

标有“周日”字样的专栏。显示第一列中日期或之前的星期日日期;标有'星期一'显示第一列中日期或之前的星期一日期。

SELECT d AS Date, WEEKDAY(d) AS W1,
       d - WEEKDAY(d) AS Sunday,
       MOD(7 + WEEKDAY(d) - 1, 7) AS W2,
       d - MOD(7 + WEEKDAY(d) - 1, 7) AS Mondat
  FROM date_list
 ORDER BY d;

2015年10月和11月的日历

Date        W1   Sunday      W2   Monday
2015-11-01   0   2015-11-01   6   2015-10-26
2015-11-02   1   2015-11-01   0   2015-11-02
2015-11-03   2   2015-11-01   1   2015-11-02
2015-11-04   3   2015-11-01   2   2015-11-02
2015-11-05   4   2015-11-01   3   2015-11-02
2015-11-06   5   2015-11-01   4   2015-11-02
2015-11-07   6   2015-11-01   5   2015-11-02
2015-11-08   0   2015-11-08   6   2015-11-02
2015-11-09   1   2015-11-08   0   2015-11-09
2015-11-10   2   2015-11-08   1   2015-11-09
2015-11-11   3   2015-11-08   2   2015-11-09
2015-11-12   4   2015-11-08   3   2015-11-09
2015-11-13   5   2015-11-08   4   2015-11-09
2015-11-14   6   2015-11-08   5   2015-11-09
2015-11-15   0   2015-11-15   6   2015-11-09
2015-11-16   1   2015-11-15   0   2015-11-16
2015-11-17   2   2015-11-15   1   2015-11-16
2015-11-18   3   2015-11-15   2   2015-11-16
2015-11-19   4   2015-11-15   3   2015-11-16
2015-11-20   5   2015-11-15   4   2015-11-16
2015-11-21   6   2015-11-15   5   2015-11-16
2015-11-22   0   2015-11-22   6   2015-11-16
2015-11-23   1   2015-11-22   0   2015-11-23
2015-11-24   2   2015-11-22   1   2015-11-23
2015-11-25   3   2015-11-22   2   2015-11-23
2015-11-26   4   2015-11-22   3   2015-11-23
2015-11-27   5   2015-11-22   4   2015-11-23
2015-11-28   6   2015-11-22   5   2015-11-23
2015-11-29   0   2015-11-29   6   2015-11-23
2015-11-30   1   2015-11-29   0   2015-11-30

存储过程

编写存储过程来进行这些计算是可能的,也是微不足道的。

    October 2015
Su Mo Tu We Th Fr Sa
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

   November 2015
Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

如果您希望星期一严格地在参考日期之前,那么您可以使用:

CREATE FUNCTION nday_on_or_before(ref_date DATE, nday INTEGER) RETURNING DATE;
    RETURN ref_date - MOD(7 + WEEKDAY(ref_date) - nday, 7);
END FUNCTION;

CREATE FUNCTION sunday_on_or_before(ref_date DATE) RETURNING DATE;
    RETURN nday_on_or_before(ref_date, 0);
END FUNCTION;

CREATE FUNCTION monday_on_or_before(ref_date DATE) RETURNING DATE;
    RETURN nday_on_or_before(ref_date, 1);
END FUNCTION;

等。请注意,CREATE FUNCTION nday_before(ref_date DATE, nday INT) RETURNING DATE; RETURN nday_on_or_before(ref_date - 1, nday); END FUNCTION; CREATE FUNCTION sunday_before(ref_date DATE) RETURNING DATE; RETURN nday_on_or_before(ref_date - 1, 0); END FUNCTION; CREATE FUNCTION monday_before(ref_date DATE) RETURNING DATE; RETURN nday_on_or_before(ref_date - 1, 1); END FUNCTION; 函数不会验证nday_*参数是否在0..6范围内;这可以通过更频繁地应用MOD功能来完成:

nday

无论 MOD(MOD(nday, 7) + 7, 7) 的输入值是正还是负,都会产生0..6范围内的值,因为内部MOD返回-6 .. + 6范围内的值,并且外部转换为0..6。或者,当nday值超出范围时,函数可能会抛出异常。