0

我已经将以下 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
4

1 回答 1

0

一点背景。问题是'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')

于 2015-12-03T23:52:15.960 回答