似乎我的练习没有任何实际用途,但我想了解我的问题在哪里涵盖。我正在尝试打印当前月份的日历(从星期一开始),所以我对解决这个问题的愿景是下一个。首先,它需要得到的总天数在一个月。
WITH days(total) AS (
SELECT 1
UNION ALL
SELECT total + 1 FROM days
LIMIT (
SELECT CAST(
julianday('now', 'start of month', '+1 month') -
julianday('now', 'start of month') AS INTEGER
)
)
) SELECT group_concat(total) FROM days;
第二,如果月份的第一天不是星期一,它需要N个空格。
WITH days(total) AS (
WITH spaces(nil) AS (
SELECT CHAR(32)
UNION ALL
SELECT nil FROM spaces
LIMIT (
SELECT strftime('%w', julianday('now', 'start of month')) -1
)
) SELECT group_concat(nil) || 1 FROM spaces
UNION ALL
SELECT total + 1 FROM days
LIMIT (
SELECT CAST(
julianday('now', 'start of month', '+1 month') -
julianday('now', 'start of month') AS INTEGER
)
)
) SELECT group_concat(total) FROM days;
第三,这是两个问题:月的最后一天会丢失,以及如何分割等量块的序列?也许有更好的解决方案?
发布于 2018-03-19 10:01:07
找到了这里的溶液。
WITH seg(b, s) AS ( -- split string on segments
VALUES (1, '')
UNION ALL
SELECT b + 21, SUBSTR((
WITH nil(e) AS ( -- spaces (if not a Monday)
SELECT CHAR(32)
UNION ALL
SELECT e FROM nil
LIMIT (
SELECT ( -- Sunday is presented by zero, so fix this
CASE WHEN dow = CAST(0 AS INTEGER) THEN 7 ELSE dow END
) FROM ( -- day of week
SELECT strftime('%w', julianday('now', 'start of month')) AS dow
)
)
) SELECT replace( -- replace all commas on spaces
'Mo,Tu,We,Th,Fr,Sa,Su,' || rtrim(group_concat(printf('%2s', e))) || (
WITH seq(n) AS ( -- days sequence
SELECT 1
UNION ALL
SELECT n + 1 FROM seq
LIMIT (
SELECT CAST(
julianday('now', 'start of month', '+1 month') -
julianday('now', 'start of month') AS INTEGER
)
)
) SELECT group_concat(printf('%2s', n)) FROM seq
), ',', CHAR(32)) FROM nil
), b, 21) FROM seg
LIMIT 8
) SELECT s FROM seg;
https://stackoverflow.com/questions/49339788
复制