是否可以创建一个SQL查询,该查询将返回一个包含给定日期范围内日期的列(例如,从去年到今天的所有日期)。 E.g。
dat
----
2007-10-01
2007-10-02
2007-10-03
2007-10-04
...
我想知道这是否可以作为创建一个包含所有预先计算的日期的表的替代方法。
更新:我需要一个MYSQL解决方案。在这种情况下,我对任何其他数据库都不感兴趣。
答案 0 :(得分:3)
AFAIK使用单个SQL查询无法做到这一点。但是,下面的代码块将完成这项工作。
目前在Transact-SQL(适用于SQL Server)中。我不知道这是如何转换为MySQL的。
DECLARE @start datetime
DECLARE @end datetime
DECLARE @results TABLE
(
val datetime not null
)
set @start = '2008-10-01'
set @end = getdate()
while @start < @end
begin
insert into @results values(@start)
SELECT @start = DATEADD (d, 1, @start)
end
select val from @results
输出:
2008-10-01 00:00:00.000
2008-10-02 00:00:00.000
2008-10-03 00:00:00.000
答案 1 :(得分:2)
在CTE之前,人们会使用一个标准的预加载整数表(通常在实用程序表中有几千个参见this article)并根据需要加入它。这在mysql中适用于你:
CREATE TABLE dbo.Numbers
(
Number INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
)
WHILE COALESCE(SCOPE_IDENTITY(), 0) <= 1024
BEGIN
INSERT dbo.Numbers DEFAULT VALUES
END
SELECT DATEADD(dd, Number, DATEADD(dd, 0, DATEDIFF(dd, 0, DATEADD(yy, -1, GETDATE())))) AS Date
FROM Numbers
WHERE Number BETWEEN 0 AND 366
在SQL Server 2005中,您可以使用公用表表达式和递归:
WITH DateRange(Date) AS
(
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, DATEADD(yy, -1, GETDATE()))) AS Date
UNION ALL
SELECT DATEADD(day, 1, Date) AS Date
FROM DateRange
WHERE Date <= GETDATE()
)
SELECT Date
FROM DateRange
OPTION (MAXRECURSION 366)
答案 2 :(得分:2)
我刚才手头没有MySQL实例,但看看是否可以。适当地替换参数。我将2007-01-01硬编码为示例。
问候。
SELECT
ADDDATE('2007-01-01' INTERVAL SeqValue DAY) DateValue
FROM
(
SELECT
(HUNDREDS.SeqValue + TENS.SeqValue + ONES.SeqValue) SeqValue
FROM
(
SELECT 0 SeqValue
UNION ALL
SELECT 1 SeqValue
UNION ALL
SELECT 2 SeqValue
UNION ALL
SELECT 3 SeqValue
UNION ALL
SELECT 4 SeqValue
UNION ALL
SELECT 5 SeqValue
UNION ALL
SELECT 6 SeqValue
UNION ALL
SELECT 7 SeqValue
UNION ALL
SELECT 8 SeqValue
UNION ALL
SELECT 9 SeqValue
) ONES
CROSS JOIN
(
SELECT 0 SeqValue
UNION ALL
SELECT 10 SeqValue
UNION ALL
SELECT 20 SeqValue
UNION ALL
SELECT 30 SeqValue
UNION ALL
SELECT 40 SeqValue
UNION ALL
SELECT 50 SeqValue
UNION ALL
SELECT 60 SeqValue
UNION ALL
SELECT 70 SeqValue
UNION ALL
SELECT 80 SeqValue
UNION ALL
SELECT 90 SeqValue
) TENS
CROSS JOIN
(
SELECT 0 SeqValue
UNION ALL
SELECT 100 SeqValue
UNION ALL
SELECT 200 SeqValue
UNION ALL
SELECT 300 SeqValue
UNION ALL
SELECT 400 SeqValue
UNION ALL
SELECT 500 SeqValue
UNION ALL
SELECT 600 SeqValue
UNION ALL
SELECT 700 SeqValue
UNION ALL
SELECT 800 SeqValue
UNION ALL
SELECT 900 SeqValue
) HUNDREDS
) SEQ
WHERE
SEQ.SeqValue < = 366 AND
ADDDATE('2007-01-01' INTERVAL SeqValue DAY) < ADDDATE('2007-01-01' INTERVAL 1 YEAR)
ORDER BY
ADDDATE('2007-01-01' INTERVAL SeqValue DAY) ASC