Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询,返回一个表,其中每行表示给定范围内的日期_Sql_Mysql - Fatal编程技术网

SQL查询,返回一个表,其中每行表示给定范围内的日期

SQL查询,返回一个表,其中每行表示给定范围内的日期,sql,mysql,Sql,Mysql,是否可以创建一个SQL查询,该查询将返回一列,其中包含给定日期范围内的日期,例如从去年到今天的所有日期。例如 dat ---- 2007-10-01 2007-10-02 2007-10-03 2007-10-04 ... 我想知道这是否可以作为创建一个包含所有预先计算的日期的表的替代方法 更新:我需要一个MYSQL的解决方案。在这种情况下,我对任何其他数据库都不感兴趣。好吧,您不能用一个SQL查询来实现这一点。但是,下面的代码块将完成这项工作 当前在Transact-SQL for SQL

是否可以创建一个SQL查询,该查询将返回一列,其中包含给定日期范围内的日期,例如从去年到今天的所有日期。例如

dat
----
2007-10-01
2007-10-02
2007-10-03
2007-10-04
...
我想知道这是否可以作为创建一个包含所有预先计算的日期的表的替代方法


更新:我需要一个MYSQL的解决方案。在这种情况下,我对任何其他数据库都不感兴趣。

好吧,您不能用一个SQL查询来实现这一点。但是,下面的代码块将完成这项工作

当前在Transact-SQL for 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

在CTEs之前,人们会使用一个标准的预加载整数表,通常在实用程序表中有几千个整数,必要时可以查看并连接到该表。这在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)

我现在手头没有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

不错,但是如果您只是想在外部查询中省略它们,则不需要在数百个派生表中选择400到选择900-比尔,我认为你的评论是开玩笑的。本示例的目的是演示该策略,而不是将其限制在400天以内。@Pittsburgh DBA-我正要问一个类似的问题,我发现这个答案非常有用。我们不要将其转化为IRC。请至少接受其中一个富有洞察力的答案。我不在乎它是不是我的;只要接受一个就行了。smink的建议应该很好地转化为MySQL的存储过程。试试看。
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