Sql 解释查询逻辑-获取当月的第一个星期三

Sql 解释查询逻辑-获取当月的第一个星期三,sql,sql-server,tsql,Sql,Sql Server,Tsql,此查询返回当前月份的第一个星期一。我只想知道这个查询是如何工作的,以及如何获得当月的第一个星期三。让我们简化整个过程: SELECT DATEADD(WEEK, DATEDIFF(WEEK, 0,DATEADD(DAY, 6 - DATEPART(DAY, GETDATE()), GETDATE())), 0),'First Monday of Current Month' 你可以这样想: SELECT DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD

此查询返回当前月份的第一个星期一。我只想知道这个查询是如何工作的,以及如何获得当月的第一个星期三。

让我们简化整个过程:

SELECT      
DATEADD(WEEK, DATEDIFF(WEEK, 0,DATEADD(DAY, 6 - DATEPART(DAY, GETDATE()),
GETDATE())), 0),'First Monday of Current Month'
你可以这样想:

SELECT DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, GETDATE()), GETDATE())), 0)

这将为您提供本月的第一个星期三,如您在评论中所要求:

-- number of day to go back to reach 1st week of month
z = 6 - DATEPART(DAY, GETDATE()) 

-- a day in 1st week of the month 
y = DATEADD(DAY, z, GETDATE()) 

-- number of weeks between 0 (1900-01-01) and 1st week of month
x = DATEDIFF(WEEK, 0, y) 

-- add the number of weeks elapsed to 1900-01-01 to get the datetime of 1st day of 1st week of month
SELECT DATEADD(WEEK, x, 0) 
我将DATEADD函数中的最后一个0更改为2,因为这是一周中几天的零表示,0是星期一

您可以使用W3schools上的“自己尝试”功能来处理查询并找出它们:。只需将查询粘贴到控制台中

我只是想知道这个查询是如何工作的

1900年1月1日是星期一。当你在星期一的基础上增加一周,你会得到另一个星期一。如果你在星期一的基础上增加6170周,你仍然会得到一个星期一。自1900年1月1日起,截至2018年10月4日,共有6170周

简单地说,该查询计算这些周数,从1900年1月1日星期一开始加上6170周

我如何获得当月的第一个星期三

1900年1月3日用整数2表示。我们将0(周一)改为2(周三)。如果你在周三加上6170周,你仍然会得到一个周三

在查询中有一个0。我们可以将其更改为2:

SELECT DATENAME(WEEKDAY, '1900-01-03')   --Wednesday
SELECT DATENAME(WEEKDAY, 2)   --also Wednesday
编辑:我可以通过去掉整数并输入实际日期来让这一点更加清楚:

SELECT      
DATEADD(WEEK, DATEDIFF(WEEK, 0,DATEADD(DAY, 6 - DATEPART(DAY, GETDATE()),
GETDATE())), 2),'First Wednesday of Current Month'

您到底需要知道什么?我不确定“SELECT DATEADD”是否会返回任何内容,DATEADD已经返回了一个值。您在哪里找到此查询?此查询返回当月的第一个星期一。我只想知道这个查询是如何工作的,以及如何获得当前月份的第一个星期三。请将最后一个0更改为“2”。学习阅读文档和调试!!!!你有没有试着去理解每一个函数的作用???你试过一件一件地运行吗???如果你只是看着它,它不会说什么。
SELECT DATENAME(WEEKDAY, '1900-01-03')   --Wednesday
SELECT DATENAME(WEEKDAY, 2)   --also Wednesday
SELECT      
DATEADD(WEEK, DATEDIFF(WEEK, 0,DATEADD(DAY, 6 - DATEPART(DAY, GETDATE()),
GETDATE())), 2),'First Wednesday of Current Month'
SELECT      
DATEADD(WEEK, DATEDIFF(WEEK, 0,DATEADD(DAY, 6 - DATEPART(DAY, GETDATE()),
GETDATE())), '1900-01-03'),'First Wednesday of Current Month'