如何在sql中以行的形式在给定的日期列中查找月份的星期一
这些都是十月的星期一,我希望它能动态运行。如果能对Mon、Tue、Wed只做同样的操作就更好了,最后一列应该是sum[如excel工作表中所示] 从中选择客户名称、工作名称、工作时间[2018-09-03]、[2018-09-10]、[2018-09-17]、[2018-09-24] 从StaleFileReport中选择ClientName、JobName、JobTime、convertdate、reporttime、101作为[ReportDate],其中convertvarchar、reporttime、102在“2018.09.03”、“2018.09.10”、“2018.09.17”、“2018.09.24”中 按ClientName、JobName、JobTime、convertdate、reporttime、101x分组 支点 计数[报告日期] [2018-09-03]、[2018-09-10]、[2018-09-17]、[2018-09-24]中的[报告日期] AS P如何在sql中以行的形式在给定的日期列中查找月份的星期一,sql,sql-server,tsql,sql-server-2008,ssms,Sql,Sql Server,Tsql,Sql Server 2008,Ssms,这些都是十月的星期一,我希望它能动态运行。如果能对Mon、Tue、Wed只做同样的操作就更好了,最后一列应该是sum[如excel工作表中所示] 从中选择客户名称、工作名称、工作时间[2018-09-03]、[2018-09-10]、[2018-09-17]、[2018-09-24] 从StaleFileReport中选择ClientName、JobName、JobTime、convertdate、reporttime、101作为[ReportDate],其中convertvarchar、rep
您可以使用如下脚本:
DECLARE @PassedInDate AS DATE;
SET @PassedInDate = GETDATE();
WITH CTE ( N )
AS (
SELECT 1
FROM ( VALUES ( 1), ( 1), ( 1), ( 1), ( 1), ( 1), ( 1), ( 1), ( 1) ) a ( N )
),
CTE2 ( N )
AS (
SELECT 0 -- 0 based
UNION ALL
SELECT TOP 30 -- limit it up front, never more than 31 days in a month!
ROW_NUMBER() OVER ( ORDER BY (SELECT NULL) )
FROM CTE a
CROSS JOIN CTE b
),
CTE3 ( N )
AS (
SELECT DATEADD(DAY, N, DATEADD(MONTH, DATEDIFF(MONTH, 1, @PassedInDate), 0))
FROM CTE2
WHERE DATEADD(DAY, N, DATEADD(MONTH, DATEDIFF(MONTH, 1, @PassedInDate), 0)) <
DATEADD(MONTH, DATEDIFF(MONTH, 1, @PassedInDate) + 1, 0)
)
SELECT N AS [DATE]
FROM CTE3
WHERE DATENAME(WEEKDAY, N) = 'Monday';
参考:您可以使用如下脚本:
DECLARE @PassedInDate AS DATE;
SET @PassedInDate = GETDATE();
WITH CTE ( N )
AS (
SELECT 1
FROM ( VALUES ( 1), ( 1), ( 1), ( 1), ( 1), ( 1), ( 1), ( 1), ( 1) ) a ( N )
),
CTE2 ( N )
AS (
SELECT 0 -- 0 based
UNION ALL
SELECT TOP 30 -- limit it up front, never more than 31 days in a month!
ROW_NUMBER() OVER ( ORDER BY (SELECT NULL) )
FROM CTE a
CROSS JOIN CTE b
),
CTE3 ( N )
AS (
SELECT DATEADD(DAY, N, DATEADD(MONTH, DATEDIFF(MONTH, 1, @PassedInDate), 0))
FROM CTE2
WHERE DATEADD(DAY, N, DATEADD(MONTH, DATEDIFF(MONTH, 1, @PassedInDate), 0)) <
DATEADD(MONTH, DATEDIFF(MONTH, 1, @PassedInDate) + 1, 0)
)
SELECT N AS [DATE]
FROM CTE3
WHERE DATENAME(WEEKDAY, N) = 'Monday';
Ref:使用WITH命令进行设置,您可以将其添加到SQLquery中,然后在查询中使用日期表
DECLARE @AdayOfMonth as date = '2018.10.01'; --any date in the month you want
WITH DAYS AS (SELECT 0 AS D UNION ALL SELECT D + 1 FROM DAYS WHERE D < 30),
PD AS (
SELECT DATEADD(day,
DAYS.D,
dateadd(day,1- DAY(@AdayOfMonth),@AdayOfMonth)) t FROM DAYS
),
AD AS (
SELECT * FROM PD where MONTH(PD.t) =
MONTH(@AdayOfMonth)
AND DATENAME(dw,PD.t) = 'monday'
)
SELECT * FROM AD; --your query in place of this simple select
使用WITH命令进行设置,可以将其添加到SQLquery中,然后在查询中使用日期表
DECLARE @AdayOfMonth as date = '2018.10.01'; --any date in the month you want
WITH DAYS AS (SELECT 0 AS D UNION ALL SELECT D + 1 FROM DAYS WHERE D < 30),
PD AS (
SELECT DATEADD(day,
DAYS.D,
dateadd(day,1- DAY(@AdayOfMonth),@AdayOfMonth)) t FROM DAYS
),
AD AS (
SELECT * FROM PD where MONTH(PD.t) =
MONTH(@AdayOfMonth)
AND DATENAME(dw,PD.t) = 'monday'
)
SELECT * FROM AD; --your query in place of this simple select
请编辑您的问题,并将SQL查询作为文本而不是屏幕截图插入。谢谢!欢迎使用SO。您正在寻找的函数是DATEPART。您好,欢迎使用SO。这是一个很好的起点。欢迎使用堆栈溢出。首先,请不要标记不相关的RDBMS。Oracle和SQL Server是完全不同的产品;图片清晰SSMS的y,那么为什么要标记Oracle?发布数据和代码时,不要将其作为图像发布。将其作为文本发布。请编辑您的问题,并将SQL查询作为文本而不是屏幕截图插入。谢谢!欢迎使用so。您要找的函数是DATEPART。您好,欢迎使用so。这是一个很好的起点。欢迎使用堆栈溢出。首先,请不要标记不相关的RDBMS。Oracle和SQL Server是完全不同的产品;图片上清楚地显示了SSM,那么为什么要标记Oracle?发布数据和代码时,不要将其作为图像发布。将其作为文本发布。