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

时间:2018-04-10 11:42:32

标签: sql sql-server tsql

def read_large_file(file_handler, block_size=10000):
    block = []
    for line in file_handler
        block.append(line)
        if len(block) == block_size:
            yield block
            block = []

    # don't forget to yield the last block
    if block:
        yield block

with open(path) as file_handler:
    for block in read_large_file(file_handler):
        print(block)

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

3 个答案:

答案 0 :(得分:2)

让我们简化一下:

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) 

答案 1 :(得分:1)

  

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

SELECT DATENAME(WEEKDAY, '1900-01-01')   --'Monday'
SELECT DATENAME(WEEKDAY, 0)   --also 'Monday'

1900年1月1日是星期一。当您在星期一添加一周时,您将获得另一个星期一。如果你在星期一增加6,170周 - 你仍然会得到星期一。截至08/10/2018,自1900年1月1日起已有6,170周。

简单地说,查询计算这些周,自1900年1月1日星期一起增加了6,170周。

  

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

SELECT DATENAME(WEEKDAY, '1900-01-03')   --Wednesday
SELECT DATENAME(WEEKDAY, 2)   --also Wednesday

1900年1月3日由整数2表示。我们将0(星期一)更改为2(星期三)。如果你在星期三增加6,170周你还会得到一个星期三。

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

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'

答案 2 :(得分:0)

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

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

我将DATEADD函数中的最后一个0更改为2,因为这是一周的基于零的表示,0表示星期一。

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