- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
不同的组织可能有不同的休息周。所以,在这种情况下,需要自定义休假的星期。为此,我尝试了下面写sql查询
DECLARE @dayName VARCHAR(9);
SET @dayName = DATEName(DW, GETDATE());
IF(@dayName = 'Friday' OR @dayName = 'Saturday')
PRINT 'Weekend';
ELSE
PRINT 'NOT Weekend';
从上面的查询中,我可以得到我的具体休假时间。
例如:
如果星期五或其他任何一天被称为周末,那么从星期五到星期四对应一个星期,我需要找到一个月中有多少个完整的星期?还是一年后?
我想根据自定义的 weekOff 获取周数。
最佳答案
首先,您需要制作整年或整月的日历,所以我会使用 cte 递归 来制作它。
SELECT DATEADD(month, DATEDIFF(month, 0, getdate()), 0) AS StartOfMonth,
DATEADD(mm,1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)) - 1 AS EndOfMonth
UNION ALL
SELECT StartOfMonth +1 , EndOfMonth
FROM CTE
WHERE StartOfMonth < EndOfMonth
一周有 7 天,无论从哪一周开始,我们都会看到这个 Gaps and Islands problem ,因为周数将从 1
到 7
重复。
所以我会使用 CASE WHEN
和 DateName 来制作您的客户周日期编号,该编号从
Friday` 开始,或者取决于您的逻辑。
;WITH CTE AS (
SELECT DATEADD(month, DATEDIFF(month, 0, getdate()), 0) AS StartOfMonth,
DATEADD(mm,1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)) - 1 AS EndOfMonth
UNION ALL
SELECT StartOfMonth +1 , EndOfMonth
FROM CTE
WHERE StartOfMonth < EndOfMonth
)
SELECT *,
CASE DateName(DW, StartOfMonth)
WHEN 'Friday' THEN 0
WHEN 'Saturday' THEN 1
WHEN 'Sunday' THEN 2
WHEN 'Monday' THEN 3
WHEN 'Tuesday' THEN 4
WHEN 'Wednesday' THEN 5
WHEN 'Thursday' THEN 6
WHEN 'Tuesday' THEN 7
END grp,
ROW_NUMBER() OVER(ORDER BY StartOfMonth) rn
FROM CTE
[结果]:
| StartOfMonth | EndOfMonth | grp | rn |
|----------------------|----------------------|-----|----|
| 2018-09-01T00:00:00Z | 2018-09-30T00:00:00Z | 1 | 1 |
| 2018-09-02T00:00:00Z | 2018-09-30T00:00:00Z | 2 | 2 |
| 2018-09-03T00:00:00Z | 2018-09-30T00:00:00Z | 3 | 3 |
| 2018-09-04T00:00:00Z | 2018-09-30T00:00:00Z | 4 | 4 |
| 2018-09-05T00:00:00Z | 2018-09-30T00:00:00Z | 5 | 5 |
| 2018-09-06T00:00:00Z | 2018-09-30T00:00:00Z | 6 | 6 |
| 2018-09-07T00:00:00Z | 2018-09-30T00:00:00Z | 0 | 7 |
| 2018-09-08T00:00:00Z | 2018-09-30T00:00:00Z | 1 | 8 |
| 2018-09-09T00:00:00Z | 2018-09-30T00:00:00Z | 2 | 9 |
| 2018-09-10T00:00:00Z | 2018-09-30T00:00:00Z | 3 | 10 |
| 2018-09-11T00:00:00Z | 2018-09-30T00:00:00Z | 4 | 11 |
| 2018-09-12T00:00:00Z | 2018-09-30T00:00:00Z | 5 | 12 |
| 2018-09-13T00:00:00Z | 2018-09-30T00:00:00Z | 6 | 13 |
| 2018-09-14T00:00:00Z | 2018-09-30T00:00:00Z | 0 | 14 |
| 2018-09-15T00:00:00Z | 2018-09-30T00:00:00Z | 1 | 15 |
| 2018-09-16T00:00:00Z | 2018-09-30T00:00:00Z | 2 | 16 |
| 2018-09-17T00:00:00Z | 2018-09-30T00:00:00Z | 3 | 17 |
| 2018-09-18T00:00:00Z | 2018-09-30T00:00:00Z | 4 | 18 |
| 2018-09-19T00:00:00Z | 2018-09-30T00:00:00Z | 5 | 19 |
| 2018-09-20T00:00:00Z | 2018-09-30T00:00:00Z | 6 | 20 |
| 2018-09-21T00:00:00Z | 2018-09-30T00:00:00Z | 0 | 21 |
| 2018-09-22T00:00:00Z | 2018-09-30T00:00:00Z | 1 | 22 |
| 2018-09-23T00:00:00Z | 2018-09-30T00:00:00Z | 2 | 23 |
| 2018-09-24T00:00:00Z | 2018-09-30T00:00:00Z | 3 | 24 |
| 2018-09-25T00:00:00Z | 2018-09-30T00:00:00Z | 4 | 25 |
| 2018-09-26T00:00:00Z | 2018-09-30T00:00:00Z | 5 | 26 |
| 2018-09-27T00:00:00Z | 2018-09-30T00:00:00Z | 6 | 27 |
| 2018-09-28T00:00:00Z | 2018-09-30T00:00:00Z | 0 | 28 |
| 2018-09-29T00:00:00Z | 2018-09-30T00:00:00Z | 1 | 29 |
| 2018-09-30T00:00:00Z | 2018-09-30T00:00:00Z | 2 | 30 |
那么我们可以尝试使用rn - grp
来获取连续的组。
[结果]:
| StartOfMonth | EndOfMonth | grp |
|----------------------|----------------------|-----|
| 2018-09-01T00:00:00Z | 2018-09-30T00:00:00Z | 0 |
| 2018-09-02T00:00:00Z | 2018-09-30T00:00:00Z | 0 |
| 2018-09-03T00:00:00Z | 2018-09-30T00:00:00Z | 0 |
| 2018-09-04T00:00:00Z | 2018-09-30T00:00:00Z | 0 |
| 2018-09-05T00:00:00Z | 2018-09-30T00:00:00Z | 0 |
| 2018-09-06T00:00:00Z | 2018-09-30T00:00:00Z | 0 |
| 2018-09-07T00:00:00Z | 2018-09-30T00:00:00Z | 7 |
| 2018-09-08T00:00:00Z | 2018-09-30T00:00:00Z | 7 |
| 2018-09-09T00:00:00Z | 2018-09-30T00:00:00Z | 7 |
| 2018-09-10T00:00:00Z | 2018-09-30T00:00:00Z | 7 |
| 2018-09-11T00:00:00Z | 2018-09-30T00:00:00Z | 7 |
| 2018-09-12T00:00:00Z | 2018-09-30T00:00:00Z | 7 |
| 2018-09-13T00:00:00Z | 2018-09-30T00:00:00Z | 7 |
| 2018-09-14T00:00:00Z | 2018-09-30T00:00:00Z | 14 |
| 2018-09-15T00:00:00Z | 2018-09-30T00:00:00Z | 14 |
| 2018-09-16T00:00:00Z | 2018-09-30T00:00:00Z | 14 |
| 2018-09-17T00:00:00Z | 2018-09-30T00:00:00Z | 14 |
| 2018-09-18T00:00:00Z | 2018-09-30T00:00:00Z | 14 |
| 2018-09-19T00:00:00Z | 2018-09-30T00:00:00Z | 14 |
| 2018-09-20T00:00:00Z | 2018-09-30T00:00:00Z | 14 |
| 2018-09-21T00:00:00Z | 2018-09-30T00:00:00Z | 21 |
| 2018-09-22T00:00:00Z | 2018-09-30T00:00:00Z | 21 |
| 2018-09-23T00:00:00Z | 2018-09-30T00:00:00Z | 21 |
| 2018-09-24T00:00:00Z | 2018-09-30T00:00:00Z | 21 |
| 2018-09-25T00:00:00Z | 2018-09-30T00:00:00Z | 21 |
| 2018-09-26T00:00:00Z | 2018-09-30T00:00:00Z | 21 |
| 2018-09-27T00:00:00Z | 2018-09-30T00:00:00Z | 21 |
| 2018-09-28T00:00:00Z | 2018-09-30T00:00:00Z | 28 |
| 2018-09-29T00:00:00Z | 2018-09-30T00:00:00Z | 28 |
| 2018-09-30T00:00:00Z | 2018-09-30T00:00:00Z | 28 |
最后,我们只得到所有 count(*) = 7
组的月数或年数,这意味着完整的周数。
查询 1:
整月
;WITH CTE AS (
SELECT DATEADD(month, DATEDIFF(month, 0, getdate()), 0) AS StartOfMonth,
DATEADD(mm,1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)) - 1 AS EndOfMonth
UNION ALL
SELECT StartOfMonth +1 , EndOfMonth
FROM CTE
WHERE StartOfMonth < EndOfMonth
)
SELECT COUNT(*) fullweekAmount from (
SELECT
MIN(StartOfMonth) startdt,
MAX(StartOfMonth) enddt
FROM (
SELECT *,
ROW_NUMBER() OVER(ORDER BY StartOfMonth) -
CASE DateName(DW, StartOfMonth)
WHEN 'Friday' THEN 0
WHEN 'Saturday' THEN 1
WHEN 'Sunday' THEN 2
WHEN 'Monday' THEN 3
WHEN 'Tuesday' THEN 4
WHEN 'Wednesday' THEN 5
WHEN 'Thursday' THEN 6
WHEN 'Tuesday' THEN 7
END grp
FROM CTE
) t1
GROUP BY grp
having count(*) = 7
) t1
Results :
| fullweekAmount |
|----------------|
| 3 |
全年
;WITH CTE AS (
SELECT DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfMonth,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) - 1 AS EndOfMonth
UNION ALL
SELECT StartOfMonth +1 , EndOfMonth
FROM CTE
WHERE StartOfMonth < EndOfMonth
)
SELECT COUNT(*) fullweekAmount from (
SELECT
MIN(StartOfMonth) startdt,
MAX(StartOfMonth) enddt
FROM (
SELECT *,
ROW_NUMBER() OVER(ORDER BY StartOfMonth) -
CASE DateName(DW, StartOfMonth)
WHEN 'Friday' THEN 0
WHEN 'Saturday' THEN 1
WHEN 'Sunday' THEN 2
WHEN 'Monday' THEN 3
WHEN 'Tuesday' THEN 4
WHEN 'Wednesday' THEN 5
WHEN 'Thursday' THEN 6
WHEN 'Tuesday' THEN 7
END grp
FROM CTE
) t1
GROUP BY grp
having count(*) = 7
) t1
option (maxrecursion 0)
注意
如果您的cte 递归日期超过 100,您将得到错误
The statement terminated. The maximum recursion 100 has been exhausted before statement completion.
可以设置
option (maxrecursion 0)
情况
数字 0
和 1
表示您的休息日
关于c# - 根据自定义周末计算周数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52125528/
我希望你能用一些代码来帮助我,它根据系统日期计算周数。 我有一个文本框 WeekNum ,我想显示 CommandButton1_Click 时的周数被激活。 我找到了有关如何从给定日期计算周数的文章
有没有一种好方法可以让年份+周数转换为R中的日期?我尝试了以下方法: > as.POSIXct("2008 41", format="%Y %U") [1] "2008-02-21 EST" > as
我有一个带有日期列的 mysql 表,我想以某种模式打印我的表,在同一列中,它应该将日期打印为日期(周号)或日期周号。 例如2014-06-05-第 22 周或 2014-06-05(第 22 周)。
我想以字符串格式从给定日期获取 ISO 周数,其中星期一是一周的第一天,包含一年中第一个星期四的那一周被认为是第一周。 从其他答案来看,我认为 strftime("2017-11-18", forma
我正在尝试创建一个脚本,该脚本在设定的时间段(上个月的 23 日和本月的 23 日)内获取工作日、日历日和工作日的计数。 我有以下脚本,我尝试使用 Worksheet Functions 但它不起作用
我确信我在这里忽略了一些非常基本的东西,但在查询和谷歌搜索大约一个小时后我无法理解它。 我已经有一个日期表了,如果有帮助的话。它填充了过去几年的日期,并通过服务器上的作业运行的存储过程每晚更新。 我需
如果在 MySQL 中只有星期几、周数、月份和年份,是否有某种方法可以获取日期? 例子: 我想知道这个参数是哪一天: 年份:2014 月份:9 月 (09) 一年中的周数:37 或 9 月的周数:3
我需要一个选择菜单(下拉菜单),其中周数为 1 到现在 + 10 周。所以我做了: week '.$x.'';
我有以下 Pandas 系列,想获得该日期的 GPS 周数: import pandas as pd from pandas import Timestamp times = pd.Series([T
我需要在我的自定义日历中设置事件,这些事件将根据选定的周期重复,即每天、每周、每月或每年。我有以毫秒为单位的开始和结束日期。 问题: 是否有任何日历或日期 API,我们可以从中计算两毫秒之间的天数、周
以下查询返回周号。 53,我认为 02-Jan-2017 是 2017 年第一周的开始。 SELECT TRUNC(CL_DT, 'IW') AS WK_STARTDATE, TRUNC
我有两个 datetime 对象;开始日期和结束日期。我需要枚举两者之间的天数、周数和月数,包括在内。 理想情况下,结果将采用 datetime 格式,但任何兼容的格式都可以。周和月由与周/月的第一天
我有一个简单的 SQL 用于计算 SQLite 报告中的周数 SELECT STRFTIME('%W', 'date_column') 2009-2012 年是正确的。在 2013 年,我总是得到错误
我有如下四个单元格,我想将它们组合在一个单元格中作为一个短日期: A1: Year A2: Month A3: Week number A4: Week day 现在我想要,Excel 查看上面的单元
如何确定 Windows 批处理文件中的 ( ISO 8601 ) 周数? 不幸的是WMIC PATH WIN32_LOCALTIME GET/FORMAT:LIST只有WeekInMonth...
我正在尝试从给定日期创建 N 周,并且周列表应排除属于该周的周。 例如,如果我给出今天的日期,那么我想生成排除本周的周数至 N 周。 下面是满足我的目的的示例,但我无法创建 N 周数,这段代码也打印当
我有一个 GPS 设备,可以将一些对象(包括 GPS 时间)发送到我的服务器。 它以周数的格式出现,秒到一周。 我想将其转换为日期时间格式。我为此找到了一些代码,但我发现的只是如何将周数转换为日期,不
我正在尝试编写一个函数来计算设备需要检查的下一个日期。我正在使用下面的代码(它不完整。) function get_next_check(){ $today = date(get_option
我有这样一个日期:171115 183130 (17-11-15 18:31:30)。我使用的 API 要求我根据周数提供日期,但由于它用于 GPS 服务,因此需要是从 1980 年(第一个纪元)开始
所以我正在为 Android 开发一个小的储蓄应用程序。我有三个我需要处理的值(value)观。我有每日储蓄金额的值(value),每月储蓄的值(value),以及年度储蓄的值(value)。然后我想
我是一名优秀的程序员,十分优秀!