Sql 向“日期”列添加值导致溢出

Sql 向“日期”列添加值导致溢出,sql,sql-server,Sql,Sql Server,我正在尝试上面的代码。如果我在没有ORDERBY子句的情况下运行它,它运行良好 SQL在使用ORDERBY子句时引发错误 向“日期”列添加值导致溢出 请帮助我,据我所知,你的问题与订货无关。问题是递归CTE 此条件的计算结果始终为true: with MyDates as ( SELECT cast( '01-oct-2020' as date ) AS MyDate, DATENAME( DW, cast('01-oct-2020' as date

我正在尝试上面的代码。如果我在没有ORDERBY子句的情况下运行它,它运行良好

SQL在使用ORDERBY子句时引发错误

向“日期”列添加值导致溢出


请帮助我,据我所知,你的问题与订货无关。问题是递归CTE

此条件的计算结果始终为true:

with MyDates as 
(

    SELECT
        cast( '01-oct-2020' as date ) AS MyDate,
        DATENAME( DW, cast('01-oct-2020' as date ) ) AS NameOfDay

    UNION ALL

    SELECT
        DATEADD( DAY, 1, MyDate ) AS MyDate,
        DATENAME( DW, DATEADD( DAY, 1, MyDate ) ) AS NameOfDay
    FROM
        MyDates
    WHERE
        DATEADD( DAY, 1, MyDate ) < DATEADD( DAY, -1, DATEADD( MONTH, 3, MyDate ) )
)
select
    *
from
    MyDates
order by
    MyDate desc
option (maxrecursion 0)

是一个dbfiddle。

它不会解决问题,但您应该将您的NameOfDay列移动到外部选择。CTE内部不需要它。我认为溢出是因为ORDER BY导致在应用maxrecursion选项之前对查询进行急切求值,因此CTE递归计算到无穷大,但实际上在通过9999-DEC-31时失败。无论如何,有比CTE更好的方法来生成日期范围。您使用的是哪种DBMS产品?SQL只是所有关系数据库使用的查询语言,而不是特定数据库产品的名称,您使用的是非标准日期函数。请为您正在使用的数据库产品添加。有比CTE更好的方法来生成日期范围。我很想知道我是一个新手,代码看起来像SQL Server代码,所以我添加了标签。请用您正在使用的数据库标记您的问题。谢谢Gorden,我可以问一下如何识别给定时间段内的第二个和第四个星期六吗?@user2922376。这就回答了你的问题。如果你还有其他问题,请问一个新问题。
   DATEADD( DAY, 1, MyDate ) < DATEADD( DAY, -1, DATEADD( MONTH, 3, MyDate ) )
with MyDates as (
    SELECT CAST( '2020-10-01' as date ) AS MyDate,
           DATENAME(weekday, '2020-10-01') AS NameOfDay,
           CAST( '2020-10-01' as date )  as orig_date
    UNION ALL
    SELECT DATEADD(DAY, 1, MyDate ) AS MyDate,
           DATENAME(weekday, DATEADD( DAY, 1, MyDate ) ) AS NameOfDay,
           orig_date
    FROM MyDates
    WHERE MyDate < DATEADD( MONTH, 3, orig_date )
)
select *
from  MyDates
order by  MyDate desc
option (maxrecursion 0);