为什么在 'where' 中使用 'month' 时 SQL 服务器返回不同的顺序?
Why is SQL Server returning a different order when using 'month' in 'where'?
我 运行 一个计算总和到 table 行的过程调用。首先我教的过程没有按预期工作,所以我浪费了半天时间试图修复实际工作正常的部分。
后来我实际看了一下在屏幕上获取数据的SELECT
,对此感到惊讶:
YEAR(M.date) = 2016
--and MONTH(M.date) = 2
和
YEAR(M.date) = 2016
and MONTH(M.date) = 2
因此第二个示例 returns 与第一个示例的排序不同。
问题是我对全年进行了计算。显示年+月参数数据。
有人可以解释为什么会发生这种情况以及如何避免这种情况吗?
在我为屏幕数据调用 SELECT
的程序中,我是这样实现的:
and (@month = 0 or (month(M.date) = @month))
and year(M.date) = @year
所以如果用户想要查看全年的数据,月份参数是可选的,而年份参数是必需的。
您正在按日期列排序。但是,日期列不是唯一的——多行具有相同的日期。 ORDER BY
returns 这些顺序随意。事实上,您可能会在不同时间对同一查询 运行 获得不同的排序。
为了 "fix" 这一点,您需要包含另一列(或多列),该列对于每一行都是唯一的。在您的情况下,这似乎是 id
列:
order by date, id
另一种思考方式是,在 SQL 中,排序不是 stable。也就是说,它们不保留数据的原始顺序。这很容易记住,因为 table 或结果集没有 "original ordering"。请记住,table 代表 无序 集合。
我 运行 一个计算总和到 table 行的过程调用。首先我教的过程没有按预期工作,所以我浪费了半天时间试图修复实际工作正常的部分。
后来我实际看了一下在屏幕上获取数据的SELECT
,对此感到惊讶:
YEAR(M.date) = 2016
--and MONTH(M.date) = 2
和
YEAR(M.date) = 2016
and MONTH(M.date) = 2
因此第二个示例 returns 与第一个示例的排序不同。
问题是我对全年进行了计算。显示年+月参数数据。
有人可以解释为什么会发生这种情况以及如何避免这种情况吗?
在我为屏幕数据调用 SELECT
的程序中,我是这样实现的:
and (@month = 0 or (month(M.date) = @month))
and year(M.date) = @year
所以如果用户想要查看全年的数据,月份参数是可选的,而年份参数是必需的。
您正在按日期列排序。但是,日期列不是唯一的——多行具有相同的日期。 ORDER BY
returns 这些顺序随意。事实上,您可能会在不同时间对同一查询 运行 获得不同的排序。
为了 "fix" 这一点,您需要包含另一列(或多列),该列对于每一行都是唯一的。在您的情况下,这似乎是 id
列:
order by date, id
另一种思考方式是,在 SQL 中,排序不是 stable。也就是说,它们不保留数据的原始顺序。这很容易记住,因为 table 或结果集没有 "original ordering"。请记住,table 代表 无序 集合。