sql - 使用 T-SQL 查找特定年份任何 ISO 周内的订单

标签 sql sql-server tsql

作为报告设置的一部分,我有一个 SQL 查询来获取每周下的订单数:

select datepart(isowk, order_date), count(*)
from orders where year(order_date) = @Year
group by datepart(isowk, order_date), year(order_date)
order by 1

请注意,我在 datepart 函数调用中使用了新的 isowk 格式,因为丹麦的企业通常使用 ISO 周数。

使用 @Year = 2010 运行此查询会产生与此类似的结果集:

1           5
2           7
3           10
...
53          3

你我都知道 2010 年还没有结束,当然还没有第 53 周。实际上,今年的前三天属于 ISO 2009 年第 53 周。虽然可以向其他程序员解释这一点,但阅读我的报告的人永远不会理解这一点。因此,我想通过将数据“移动”到 2009 年来摆脱第 53 周。

我如何重写我的 WHERE 子句以将数据集过滤为定义为 @ 的年份中第 1 周的星期一和最后一周的星期五(52 或 53)之间的订单年份?

最佳答案

事实上,我不知道任何提供 isoyear 的编程语言......

create function isoyear(@date datetime) returns smallint as begin
declare @isoyear smallint =
    case
    when datepart(isowk, @date) = 1 and month(@date) = 12
    then year(@date)+1
    when datepart(isowk, @date) = 53 and month(@date) = 1
    then year(@date)-1
    else year(@date)
    end;
return @isoyear;
end;

希望我们下次能得到一个 datepart(isoyear, ...) ...

关于sql - 使用 T-SQL 查找特定年份任何 ISO 周内的订单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4434112/

相关文章:

sql-server - 可以在多重多边形中获得单独的多边形吗?

sql-server - 在连接表中,我应该使用主键和唯一约束,还是复合/复合键?

mysql - 从经度和纬度坐标获取邮政编码

sql - 将数据类型 varchar 转换为 bigint 时出错

Java与SQL登录相关

sql - 在 SQL Server 2005 中设置和重置日期格式

sql - 如果条件通过,如何退出存储过程

sql - 使用 IN 关键字查询

sql - 跨多个服务器复制数据 SQL

SQL Statement JOIN 只返回有关联的元素