如何在Informix SQL中选择本周的第一天?
答案 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;
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
值超出范围时,函数可能会抛出异常。