我试图在SELECT
语句中获取一年中的所有日期,其中9个INT字段的值为0。
基本上我需要以下内容:
1/1/2007 0 0 0 0 0 0 0 0 0
1/2/2007 0 0 0 0 0 0 0 0 0
1/3/2007 0 0 0 0 0 0 0 0 0
等等一整年。
年份总是1/1 - 12/31
这是一个更大的查询的一部分,但我不认为这部分是必要的,因为这是我需要的部分....
谢谢!
答案 0 :(得分:8)
你走了:
WITH Dates AS (
SELECT
[Date] = CONVERT(DATETIME,'01/01/2010')
UNION ALL SELECT
[Date] = DATEADD(DAY, 1, [Date])
FROM
Dates
WHERE
Date < '12/31/2010'
) SELECT
[Date],0,0,0,0,0,0,0,0,0
FROM
Dates
OPTION (MAXRECURSION 400)
陶醉于递归CTE的魔力!
答案 1 :(得分:3)
您可以使用递归CTE动态执行此操作,假设您使用的是SQL Server 2005或更高版本):
WITH CTEDates AS
(
SELECT CAST('20070101' AS DATETIME) AS DateVal
UNION ALL
SELECT DATEADD(dd, 1, DateVal)
FROM CTEDates
WHERE DateVal < '20071231'
)
SELECT DateVal, 0,0,0,0,0,0,0,0,0
FROM CTEDates
OPTION (MAXRECURSION 366)
有关递归CTE的更多信息,请查看MSDN - 这是值得了解的最佳信息!
答案 2 :(得分:3)
DECLARE @year INT
,@startDate DATE
SET @year = 2010
SET @startDate = CAST(@year AS VARCHAR) + '-01-01'
DECLARE @DateTable TABLE
(
[Date] DATE ,[Col1] INT ,[Col2] INT ,[Col3] INT ,[Col4] INT
,[Col5] INT ,[Col6] INT ,[Col7] INT ,[Col8] INT ,[Col9] INT
)
--
;
WITH cte
AS ( SELECT @StartDate [Date]
UNION ALL
SELECT DATEADD(DAY, 1, [Date])
FROM [cte]
WHERE [Date] < DATEADD(year, 1, @StartDate)
)
INSERT INTO @DateTable
(
[Date] ,[Col1] ,[Col2] ,[Col3] ,[Col4] ,[Col5]
,[Col6] ,[Col7] ,[Col8] ,[Col9] )
SELECT [Date] ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
FROM [cte] OPTION (MAXRECURSION 366)
考虑创建Date Table
或至少Tally Table
答案 3 :(得分:1)
在数据库中实际看到有时可以选择的日期表是很常见的 - 如下所示:
CREATE TABLE tDates (
dtDate datetime NOT NULL,
iYear int NOT NULL,
iMonth int NOT NULL,
iDayOfMonth int NOT NULL,
/* iWeekNumber, day of week, whatever else is useful to you */
);
SELECT dtDate, 0, 0, 0, 0, 0, 0, 0 FROM tDates WHERE iYear = 2010;
额外的字段可以轻松查询不同的日期块。在C#/ VB中生成数据应该是微不足道的 - 我确信一些PowerShell专家也可以很容易地编写脚本。只需花费少量时间准备这样的表就可以为您节省大量的查询痛苦。
答案 4 :(得分:1)
这将为您提供一个数字为1-370的表格。在你得到它之后,用你的START DATE和DATEADD加入整数(0-370),直到你到达一年的最后一个日期。
SELECT DATEADD(DD, X.Number, '12/31/2006'), 0, 0, 0, 0, 0, 0, 0, 0, 0
FROM (
SELECT TOP 370 ROW_NUMBER() OVER(ORDER BY Column_NAME) AS Number
FROM INFORMATION_SCHEMA.COLUMNS ) X
WHERE DATEADD(DD, X.Number, '12/31/2006') <= '12/31/2007'
答案 5 :(得分:0)
试试这个:
Declare @dt SmallDateTime Set @dt = '1 Jan 2007'
Declare @dts Table ( dt SmallDateTime Primary Key Not Null )
While (@dt < '1 Jan 2008') Begin
Insert @dts(dt) Values(@dt)
Set @dt = DateAdd(day, 1, @dt)
End
Select dt, 0 intColA,
0 intColB, 0 intColC, 0 inColD,
0 intColE, 0 intColF, 0 inColG,
0 intColH, 0 intColI, 0 inColJ
From @dts
答案 6 :(得分:0)
您应该查看this website,它解释了如何在数据库中创建日期(或日历)表。
以下是来自网站的一些修改后的代码示例,应该为您提供帮助:
WITH CTE_DatesTable
AS
(
SELECT CAST('20100101' as datetime) AS [date], 0 as one, 0 as two
UNION ALL
SELECT DATEADD(dd, 1, [date]), 0 as one, 0 as two
FROM CTE_DatesTable
WHERE DATEADD(dd, 1, [date]) <= '20101231'
)
SELECT * FROM CTE_DatesTable
OPTION (MAXRECURSION 0);
当然你必须添加所有9“0”(例如我添加了两个)。