Sql 在最后,我看到了她。你知道为什么它只在where子句中抛出错误,而在它不存在时不抛出吗?@livingparadox是的,我也只是在看执行计划,因为我明白为什么你会认为EOMONTH()会处理这个问题,但这是一种操作顺序。因此,在解释where子句之前,将
Sql 在最后,我看到了她。你知道为什么它只在where子句中抛出错误,而在它不存在时不抛出吗?@livingparadox是的,我也只是在看执行计划,因为我明白为什么你会认为EOMONTH()会处理这个问题,但这是一种操作顺序。因此,在解释where子句之前,将,sql,sql-server,date,Sql,Sql Server,Date,在最后,我看到了她。你知道为什么它只在where子句中抛出错误,而在它不存在时不抛出吗?@livingparadox是的,我也只是在看执行计划,因为我明白为什么你会认为EOMONTH()会处理这个问题,但这是一种操作顺序。因此,在解释where子句之前,将对整个数据集的DATEFROMPARTS()部分进行分析。因此,它试图在将日期限制在EOMOUNT()定义的天数之前,将日期设置为2月29日、30日等。你能在你的回答中加上这个解释吗?我接受了你的回答,因为你们都提供了我想要的解释和替代方案。
在最后,我看到了她。你知道为什么它只在where子句中抛出错误,而在它不存在时不抛出吗?@livingparadox是的,我也只是在看执行计划,因为我明白为什么你会认为EOMONTH()会处理这个问题,但这是一种操作顺序。因此,在解释where子句之前,将对整个数据集的DATEFROMPARTS()部分进行分析。因此,它试图在将日期限制在EOMOUNT()定义的天数之前,将日期设置为2月29日、30日等。你能在你的回答中加上这个解释吗?我接受了你的回答,因为你们都提供了我想要的解释和替代方案。
Dates as (
select try_convert(date, concat(year, '-' month, '-', day)) as Date
from Years y cross join
Months m cross join
Days
where try_convert(date, concat(year, '-' month, '-', day)) and
DAY(EOMONTH(FirstOfTheYear, Month - 1)) >= Day
)
-- Create up to 16 million integers
WITH N AS (SELECT 0 AS N FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7)) T(n))
, M AS (SELECT 0 AS N FROM N A, N B, N C, N D, N E, N F, N G, N H)
, Z AS (SELECT ROW_NUMBER() OVER (ORDER BY A.N) AS N FROM M A)
-- Filter only the integers you need; add to a start date
SELECT CAST(DATEADD(DAY, N-1, '2015-01-01') AS DATE) FROM Z
WHERE N < DATEDIFF(DAY, '2015-01-01', '2020-01-01')
;WITH cteTen AS (
SELECT n FROM (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) T(n)
)
, cteTally AS (
SELECT
N = ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1
FROM
cteTen t10
CROSS JOIN cteTen t100
CROSS JOIN cteTen t1000
CROSS JOIN cteTen t10000
)
, cteStartOfNextYear AS (
SELECT
StartOfNextYear = s.[Date]
,NumOfDaysBetween = DATEDIFF(DAY,DATEADD(YEAR,-5,s.[Date]),s.[Date])
FROM
(VALUES (DATEFROMPARTS(YEAR(GETDATE()) + 1, 1, 1))) s([Date])
)
, cteDates AS (
SELECT
[Date] = DATEADD(DAY,- t.N, s.StartOfNextYear)
FROM
cteStartOfNextYear s
INNER JOIN cteTally t
ON t.N <= NumOfDaysBetween
)
SELECT *
FROM
cteDates
ORDER BY
[Date]