【问题标题】:T-SQL calculated column how to get ISO week number [duplicate]T-SQL计算列如何获取ISO周数[重复]
【发布时间】:2015-03-14 04:38:55
【问题描述】:

我有这个基于日期和计算列的日历表(下面的代码)。问题是由于逻辑 52 * 7 = 364 它返回我第 53 周,所以实际上我们每年总是有一些“空闲”天数,例如 2014 年的这些天:

2014-12-28
2014-12-29
2014-12-30
2014-12-31

在我工作的公司,我们必须使用 ISO 日历周。如何更改此表以获得 ISO 日历周而不是这个?

我忘了说我使用的是:SQL Server 2008 R2 和 2012。

CREATE TABLE [dbo].[TO_BDB_NOSSCE_CALENDAR](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [DATE] [date] NOT NULL,
    [YEAR]  AS (datepart(year,[DATE])) PERSISTED,
    [SEMESTER]  AS (case when datepart(month,[DATE])<(7) then '1' else '2' end) PERSISTED NOT NULL,
    [TRIMESTER]  AS (case when datepart(month,[DATE])<(4) then '1' else case when datepart(month,[DATE])<(7) then '2' else case when datepart(month,[DATE])<(10) then '3' else '4' end end end) PERSISTED NOT NULL,
    [MONTH]  AS (case when len(CONVERT([varchar](2),datepart(month,[DATE]),0))=(1) then '0'+CONVERT([varchar](2),datepart(month,[DATE]),0) else CONVERT([varchar](2),datepart(month,[DATE]),0) end) PERSISTED,
    [WEEK]  AS (case when len(CONVERT([varchar](2),datepart(week,[DATE]),0))=(1) then '0'+CONVERT([varchar](2),datepart(week,[DATE]),0) else CONVERT([varchar](2),datepart(week,[DATE]),0) end),
    [DAY]  AS (case when len(CONVERT([varchar](2),datepart(day,[DATE]),0))=(1) then '0'+CONVERT([varchar](2),datepart(day,[DATE]),0) else CONVERT([varchar](2),datepart(day,[DATE]),0) end) PERSISTED,
    [WEEKNUMBER]  AS (datepart(week,[DATE])),
PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

【问题讨论】:

  • 请记住,除了周数之外,您可能还需要周年(不一定等于日期年)。 2010 年 1 月 1 日是 ISO 2009 年最后一周的一部分。您真的不想将其呈现为“2010 年第 53 周”,那是完全错误的。另请注意,如该特定示例所示,ISO 周数仍然可以增加到 53。

标签: sql sql-server tsql calculated-columns


【解决方案1】:

在 SQL Server 2008+ 中,您可以使用以下内容:

SELECT DATEPART(ISO_WEEK, <DATE>)

以下 SO 问题讨论了得出 ISO 周的其他方法:

Isoweek in SQL Server 2005

【讨论】:

  • 完美,谢谢!我忘了在原帖中提到我有 2008 R2 和 2012 版本……所以总有更简单的方法!
  • 请注意,除了周数之外,还必须包含 ISO 周 year,因为它可能与正常日期年份不同。可以这样计算:YEAR(DATEADD(wk, DATEDIFF(d, 0, @dt) / 7, 3))
猜你喜欢
  • 1970-01-01
  • 2018-03-17
  • 2015-01-11
  • 1970-01-01
  • 2013-02-22
  • 2019-08-04
  • 1970-01-01
  • 2019-02-04
  • 2020-08-25
相关资源
最近更新 更多