SQL - 关于将日期转换为数字并检查参数是否在范围内的说明
SQL - Explanation about converting date to numbers and checking if parameter is between the range
我正在调整一些代码,我发现了这个查询:
SELECT <some columns>
FROM sample_table AS M
WHERE YEAR(@BETWEEN_DATE) * 365 + MONTH(@BETWEEN_DATE) * 30 + DAY(@BETWEEN_DATE)
BETWEEN (
YEAR(M.STARTINGDATE) * 365 + MONTH(M.STARTINGDATE) *
30 + DAY(M.STARTINGDATE)
)
AND
CASE
WHEN M.ENDINGDATE IS NULL THEN (
YEAR('99990101') * 365 + MONTH('99990101') * 30 + DAY('19000101')
)
ELSE (
YEAR(M.ENDINGDATE) * 365 + MONTH(M.ENDINGDATE)
* 30 + DAY(M.ENDINGDATE)
)
END
从前面的查询来看,@BETWEEN_DATE
参数被转换为数字,但是老实说,这个逻辑对我来说太混乱了。
EDIT: 参数 @BETWEEN_DATE
和列 M.STARTINGDATE
和 M.ENDINGDATE
的数据类型是 DATETIME
.
I can imagen that @BETWEEN_DATE
is converted to number for validate if M.STARTINGDATE
and M.ENDINGDATE
are between the range. Those starting and ending dates are operated in that way for aggregate a year to the value in M.STARTINGDATE
and M.ENDINGDATE
columns; but; I'm not entirely sure.
结果"in the case there parameter @BETWEEN_DATE
is 2020-06-18 00:00:00.000
",年月日的值如下:
DECLARE @BETWEEN_DATE DATETIME = CAST(GETDATE() AS DATE);
SELECT @BETWEEN_DATE AS FECHA, YEAR(@BETWEEN_DATE) * 365 + MONTH(@BETWEEN_DATE) * 30 + DAY(@BETWEEN_DATE) AS NUMERIC_RESULT,
YEAR(@BETWEEN_DATE) * 365 AS _YEAR,
MONTH(@BETWEEN_DATE) * 30 AS _MONTH,
DAY(@BETWEEN_DATE) AS _DAY;
Year: 737300
Month: 180
Day: 18
我想修改此查询并理解它以使其更 legible/simple 易于理解。
查询 returns table 的所有行,其中变量 @BETWEEN_DATE
的值介于 STARTINGDATE
和 ENDINGDATE
的日期部分之间, 但它以一种不必要的复杂方式做到这一点。
试试这个简化版本:
SELECT <some columns>
FROM sample_table
WHERE @BETWEEN_DATE >= CONVERT(DATE, STARTINGDATE)
AND (ENDINGDATE IS NULL OR @BETWEEN_DATE <= CONVERT(DATE, M.ENDINGDATE))
我正在调整一些代码,我发现了这个查询:
SELECT <some columns>
FROM sample_table AS M
WHERE YEAR(@BETWEEN_DATE) * 365 + MONTH(@BETWEEN_DATE) * 30 + DAY(@BETWEEN_DATE)
BETWEEN (
YEAR(M.STARTINGDATE) * 365 + MONTH(M.STARTINGDATE) *
30 + DAY(M.STARTINGDATE)
)
AND
CASE
WHEN M.ENDINGDATE IS NULL THEN (
YEAR('99990101') * 365 + MONTH('99990101') * 30 + DAY('19000101')
)
ELSE (
YEAR(M.ENDINGDATE) * 365 + MONTH(M.ENDINGDATE)
* 30 + DAY(M.ENDINGDATE)
)
END
从前面的查询来看,@BETWEEN_DATE
参数被转换为数字,但是老实说,这个逻辑对我来说太混乱了。
EDIT: 参数 @BETWEEN_DATE
和列 M.STARTINGDATE
和 M.ENDINGDATE
的数据类型是 DATETIME
.
I can imagen that
@BETWEEN_DATE
is converted to number for validate ifM.STARTINGDATE
andM.ENDINGDATE
are between the range. Those starting and ending dates are operated in that way for aggregate a year to the value inM.STARTINGDATE
andM.ENDINGDATE
columns; but; I'm not entirely sure.
结果"in the case there parameter @BETWEEN_DATE
is 2020-06-18 00:00:00.000
",年月日的值如下:
DECLARE @BETWEEN_DATE DATETIME = CAST(GETDATE() AS DATE);
SELECT @BETWEEN_DATE AS FECHA, YEAR(@BETWEEN_DATE) * 365 + MONTH(@BETWEEN_DATE) * 30 + DAY(@BETWEEN_DATE) AS NUMERIC_RESULT,
YEAR(@BETWEEN_DATE) * 365 AS _YEAR,
MONTH(@BETWEEN_DATE) * 30 AS _MONTH,
DAY(@BETWEEN_DATE) AS _DAY;
Year: 737300
Month: 180
Day: 18
我想修改此查询并理解它以使其更 legible/simple 易于理解。
查询 returns table 的所有行,其中变量 @BETWEEN_DATE
的值介于 STARTINGDATE
和 ENDINGDATE
的日期部分之间, 但它以一种不必要的复杂方式做到这一点。
试试这个简化版本:
SELECT <some columns>
FROM sample_table
WHERE @BETWEEN_DATE >= CONVERT(DATE, STARTINGDATE)
AND (ENDINGDATE IS NULL OR @BETWEEN_DATE <= CONVERT(DATE, M.ENDINGDATE))