给定日期计算同一周的星期几

given a date calculate date of week day in the same week

我已经将以下 sql 代码散列在一起以从我的时间表数据中获取我想要的输出。不确定以这种方式检索数据的最有效方式,但似乎可行。我发现的唯一问题是某些记录上显示的日期晚了一周。因此,如果时间表日期是 2015 年 12 月 2 日,当我计算该周星期一的日期时,我需要减去“-7 天”作为下星期一的日期。我正在考虑用变量来做这件事,但是阅读 sqlite 不支持变量。请有人告诉我解决这个问题的最佳方法。

我附上下面的代码

SELECT 'Mon' , DATE(t.date, 'weekday 1') AS myDate , tl.projectID , t.staffID , tl.mon AS hours, t.date
FROM timesheet_line AS tl
LEFT JOIN timesheet AS t ON tl.timesheetID = t.timesheetID
LEFT JOIN staff AS s ON t.staffID = s.staffID
WHERE (t.date BETWEEN '2014-03-01' AND '2015-12-01') AND (tl.mon NOT Null) AND (tl.mon <> '')

UNION ALL

SELECT 'Tues' , DATE(t.date, 'weekday 2') AS myDate , tl.projectID , t.staffID , tl.tues AS hours, t.date
FROM timesheet_line AS tl
LEFT JOIN timesheet AS t ON tl.timesheetID = t.timesheetID
LEFT JOIN staff AS s ON t.staffID = s.staffID
WHERE (t.date BETWEEN '2014-03-01' AND '2015-12-01') AND (tl.tues NOT Null) AND (tl.tues <> '')

UNION ALL

SELECT 'Wed' , DATE(t.date, 'weekday 3') AS myDate , tl.projectID , t.staffID , tl.wed AS hours, t.date
FROM timesheet_line AS tl
LEFT JOIN timesheet AS t ON tl.timesheetID = t.timesheetID
LEFT JOIN staff AS s ON t.staffID = s.staffID
WHERE (t.date BETWEEN '2014-03-01' AND '2015-12-01') AND (tl.wed NOT Null) AND (tl.wed <> '')

UNION ALL

SELECT 'Thurs' , DATE(t.date, 'weekday 4') AS myDate , tl.projectID , t.staffID , tl.thurs AS hours, t.date
FROM timesheet_line AS tl
LEFT JOIN timesheet AS t ON tl.timesheetID = t.timesheetID
LEFT JOIN staff AS s ON t.staffID = s.staffID
WHERE (t.date BETWEEN '2014-03-01' AND '2015-12-01') AND (tl.thurs NOT Null) AND (tl.thurs <> '')

UNION ALL

SELECT 'Fri' , DATE(t.date, 'weekday 5') AS myDate , tl.projectID , t.staffID , tl.fri AS hours, t.date
FROM timesheet_line AS tl
LEFT JOIN timesheet AS t ON tl.timesheetID = t.timesheetID
LEFT JOIN staff AS s ON t.staffID = s.staffID
WHERE (t.date BETWEEN '2014-03-01' AND '2015-12-01') AND (tl.fri NOT Null) AND (tl.fri <> '')

UNION ALL

SELECT 'Sat' , DATE(t.date, 'weekday 6') AS myDate , tl.projectID , t.staffID , tl.sat AS hours, t.date
FROM timesheet_line AS tl
LEFT JOIN timesheet AS t ON tl.timesheetID = t.timesheetID
LEFT JOIN staff AS s ON t.staffID = s.staffID
WHERE (t.date BETWEEN '2014-03-01' AND '2015-12-01') AND (tl.sat NOT Null) AND (tl.sat <> '')

UNION ALL

SELECT 'Sun' , DATE(t.date, 'weekday 0') AS myDate , tl.projectID , t.staffID , tl.sun AS hours, t.date
FROM timesheet_line AS tl
LEFT JOIN timesheet AS t ON tl.timesheetID = t.timesheetID
LEFT JOIN staff AS s ON t.staffID = s.staffID
WHERE (t.date BETWEEN '2014-03-01' AND '2015-12-01') AND (tl.sun NOT Null) AND (tl.sun <> '')

ORDER BY myDate ASC

一点背景。问题是 'weekday N' 修饰符给你下一个星期几 == N 的日期。因此,如果您提供 Date 函数的日期是星期一,并且您询问 'weekday 0'(星期日),它会为您提供即将到来的星期日,但如果您询问 'weekday 2'(星期二),您将获得本周的星期二,因为该日期尚未过去。

因此,如果您知道 timesheet.date 的星期几总是星期一或其他日期,您可以硬编码调整以回到一周的开始:
Date(t.date, '-1 day', 'weekday 1')

但是如果您不想做那个假设,您可以使用 strftime 来计算您对每条记录的调整:
Date(t.date, strftime('-%w days',t.date), 'weekday 1')