我有一张空白表,其中有两列[ID]
和[MyDate]
。
我希望在当前MINUS
个周末的所有日子里填充该表格。
有没有办法用SQL查询执行此操作?
在这种情况下,我使用的是MSSQL T-SQL
我没有任何示例代码,因为我对这个场景的入门点不知所措。
答案 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生成所需的日期。我已经使用DATEFROMPARTS
和GETDATE()
来获得今年的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
答案 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