将每年的每周工作日的记录添加到空白表中

时间:2017-03-15 06:57:12

标签: sql sql-server

我有一张空白表,其中有两列[ID][MyDate]。 我希望在当前MINUS个周末的所有日子里填充该表格。

有没有办法用SQL查询执行此操作?

在这种情况下,我使用的是MSSQL T-SQL

我没有任何示例代码,因为我对这个场景的入门点不知所措。

3 个答案:

答案 0 :(得分:1)

使用数字(Tally)表可以帮助您避免使用循环。 如果您还没有数字表,可以使用此脚本创建它:

SELECT TOP 10000 IDENTITY(int,0,1) AS Number
    INTO Tally
    FROM sys.objects s1       
    CROSS JOIN sys.objects s2 
ALTER TABLE Tally ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number)

有关创建数字表的更多信息,请read this SO post.

现在您有了一个数字表,您可以使用cte生成所需的日期。我已经使用DATEFROMPARTSGETDATE()来获得今年的Jauary 1st,如果您使用的是2012年以下的sql server版本,则需要使用其他方法:

DECLARE @StartDate Date,
        @EndDate Date 

SELECT @StartDate = DATEFROMPARTS(YEAR(GetDate()), 1, 1)
SELECT @EndDate = DATEADD(Year, 1, @StartDate)

现在,创建一个CTE以使用数字表获取所需的日期,并将cte中的记录插入到表中:

;WITH CTE AS                                       
(
    SELECT DATEADD(Day, Number, @StartDate) As TheDate
    FROM Tally
    WHERE DATEADD(Day, Number, @StartDate) < @EndDate
)

INSERT INTO WeekDays
SELECT TheDate
FROM CTE
WHERE DATEPART(WeekDay, TheDate) BETWEEN 2 AND 6

See a live demo on rextester.

答案 1 :(得分:0)

这是我对你的问题的快速尝试。只需使用你的表

select 
CAST('2017-03-15' as datetime) as datestuff
into #test


Delete from #test

DECLARE @Y datetime = CAST('2017-12-31' AS DATE)

while @y != '2017-01-01'
    begin
        if DATENAME(DW, @y) not IN ('SUNDAY', 'SATURDAY')
            BEGIN
                INSERT INTO #test 
                SELECT @y 

            END


        SET @Y = DATEADD(DD, -1, @Y)
    end

    select * from #test

答案 2 :(得分:0)

这样做。这里1和7代表星期日和星期六

CREATE TABLE T (
    ID INT NOT NULL IDENTITY(1,1),
    MyDate DATE NOT NULL)

DECLARE @Start DATE
DECLARE @End DATE

SET @Start = '20170101'
SET @End = '20171231'

WHILE @Start <= @End
BEGIN
    IF (DATEPART(DW, @Start) NOT IN (1,7))
    BEGIN
        INSERT INTO T (MyDate) VALUES (@Start)
    END 

    SET @Start = DATEADD(DAY, 1, @Start)
END

SELECT * FROM T