【问题标题】:T-SQL How to get Week Number (ISO) of First Week from all Quarters from GetDate()?T-SQL如何从GetDate()获取所有季度的第一周的周数(ISO)?
【发布时间】:2018-03-17 14:57:23
【问题描述】:

标题说明了很多。

但更准确地说,我需要从 GetDate() 获取任何给定年份的第 1-4 季度开始的每周第一次的周数。

不确定这是内置的还是我必须为其编写一个函数。

谢谢!

【问题讨论】:

  • 到目前为止你尝试过什么?习惯上先试一试,然后就你的方法/技术征求意见。
  • 您使用的是“季度”的哪个定义?第 1 季度是从第 1 周开始,还是从 1 月 1 日开始?
  • @Fellmeister,对不起,我还没有尝试过任何东西......虽然现在正在做......我在这里发布的原因是因为我有点着急:-(跨度>
  • @hvd 本季度从 1 月 1 日、4 月、7 月、10 月开始
  • 您询问“从第 1-4 季度开始的每周的第一次周数”,但已经接受了一个答案,该答案为您提供了第 1-4 季度开始的周数。这些很接近,但不是一回事。你确定你得到了你要找的号码吗?

标签: sql sql-server function date


【解决方案1】:

这很简单,但可以解决问题。您可以将@date 设置为任何给定值。我用getdate()

declare @date datetime = getdate()

declare @year int = datepart(year, @date)

select @year as [year]
      ,datepart(iso_week, cast('1/1/'  + cast(@year as char(4)) as date)) as ISOWeekQ1
      ,datepart(iso_week, cast('4/1/'  + cast(@year as char(4)) as date)) as ISOWeekQ2
      ,datepart(iso_week, cast('7/1/'  + cast(@year as char(4)) as date)) as ISOWeekQ3
      ,datepart(iso_week, cast('10/1/' + cast(@year as char(4)) as date)) as ISOWeekQ4

对我来说,这返回了:

year        ISOWeekQ1   ISOWeekQ2   ISOWeekQ3   ISOWeekQ4
----------- ----------- ----------- ----------- -----------
2017        52          13          26          39

这也有效,并且不会使用cast() 或为不同的日期格式(例如,yyyy/mm/dd)带来日期转换错误的风险:

declare @date datetime = getdate()

set @date = dateadd(day, - datepart(dayofyear, @date) + 1, @date) -- sets date to Jan 1

select datepart(year, @date) [year]
      ,datepart(iso_week, @date) as ISOWeekQ1
      ,datepart(iso_week, dateadd(month, 3, @date)) as ISOWeekQ2
      ,datepart(iso_week, dateadd(month, 6, @date)) as ISOWeekQ3
      ,datepart(iso_week, dateadd(month, 9, @date)) as ISOWeekQ4

此查询的输出与第一个相同。

【讨论】:

  • 如果你有 SQL Server 2012+,你可以使用datepart(iso_week, datefromparts(@year,1,1)) as ISOWeekQ1, [...]datepart(iso_week, datefromparts(year(getdate()),1,1)) as ISOWeekQ1, [...]。这稍微优雅一些​​。
猜你喜欢
  • 2020-06-04
  • 1970-01-01
  • 2015-03-14
  • 2015-01-11
  • 2012-11-22
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
相关资源
最近更新 更多