【问题标题】:Calculate first day and last day of week of current month计算当月一周的第一天和最后一天
【发布时间】:2017-12-08 19:59:53
【问题描述】:

在给定当前日期时间的情况下,我想计算当前月份一周的第一个日期和最后一个日期。

例如,2017 年 12 月 1 日是第一天,2017 年 12 月 2 日是 12 月该周的最后一天。在一年中的同一周,2017 年 11 月 26 日是一周的第一天, 2017 年 11 月 30 日是上个月的最后一天。

所以如果今天是 2017 年 12 月 1 日,我应该从当前日期时间得到 01-02,而不是 26-02 范围。

PS:我正在尝试在 Sqlite 的查询中执行此操作。我想每周对一些值进行分组。星期几应属于当前月份。因此有这个要求。到目前为止,这是我的查询。

SELECT SUM(amount) as Y,
strftime('%d', datetime(createdOn/1000, 'unixepoch'), '-'||strftime('%w', datetime(createdOn/1000, 'unixepoch'))||' day' )
||'-'||
strftime('%d', datetime(createdOn/1000, 'unixepoch'), '+'||(6-strftime('%w', datetime(createdOn/1000, 'unixepoch')))||' day' )                 AS X
FROM my_table
GROUP BY strftime('%d', datetime(createdOn/1000, 'unixepoch'), '-'||strftime('%w', datetime(createdOn/1000, 'unixepoch'))||' day' )
||'-'||
strftime('%d', datetime(createdOn/1000, 'unixepoch'), '+'||(6-strftime('%w', datetime(createdOn/1000, 'unixepoch')))||' day' ) 

如何实现;给定当前日期时间。

【问题讨论】:

  • 检查计算的一周的第一天/最后一天的月份;如果错误,请计算该月的第一天/最后一天。使用date functionsCASE expressions
  • @CL 我已经提供了我的查询。你能推荐一些更好的吗?
  • @CL 我能够完善我的查询。感谢您的评论。

标签: sqlite datetime calculator


【解决方案1】:

Common table expressions 可用于保存中间结果:

WITH t1 AS (
  SELECT amount, date(createdOn / 1000, 'unixepoch', 'localtime') AS date
  FROM my_table
),
t2 AS (
  SELECT *,
         date(date, 'weekday 6') AS end_of_week,
         date(date, 'weekday 6', '-6 days') AS start_of_week
  FROM t1
),
t3 AS (
  SELECT *,
         strftime('%m', date         ) AS month,
         strftime('%m', start_of_week) AS sowk_month,
         strftime('%m', end_of_week  ) AS eowk_month,
         date(date, 'start of month') AS start_of_month,
         date(date, '+1 month', 'start of month', '-1 day') AS end_of_month
  FROM t2
),
t4 AS (
  SELECT *,
         CASE WHEN sowk_month = month THEN start_of_week
                                      ELSE start_of_month
         END AS week_in_month_start,
         CASE WHEN eowk_month = month THEN end_of_week
                                      ELSE end_of_month
         END AS week_in_month_end
  FROM t3
),
t5 AS (
  SELECT amount,
         week_in_month_start || '-' || week_in_month_end AS week_in_month
  FROM t4
)
SELECT SUM(amount) AS Y,
       week_in_month
FROM t5
GROUP BY week_in_month;

【讨论】:

  • 这比我的回答要好得多。我已经删除了我的答案。
猜你喜欢
  • 2011-01-06
  • 1970-01-01
  • 2016-02-09
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 2017-07-21
  • 1970-01-01
相关资源
最近更新 更多