【问题标题】:Getting week number of date in SQL在 SQL 中获取日期的周数
【发布时间】:2013-03-04 04:17:02
【问题描述】:

有没有办法使用独立于数据库的 SQL 来获取日期的周数?

例如获取我使用的日期的月份:

SELECT EXTRACT(MONTH FROM :DATE)

但 EXTRACT 函数不知道 SQL92 中的周数。

请注意我想要一个数据库独立的解决方案!不要将此误解为有关 MS SQL Server 的问题。

【问题讨论】:

  • WEEK('2013-01-15')SELECT extract(week FROM now()) 怎么样
  • 请通过添加适当的标签(Oracle、SQL Server、MySQL 等)来指定您的目标关系数据库管理系统。可能有一些答案利用了不受普遍支持的语言或产品功能。此外,通过使用特定的 RDBMS 对其进行标记,您的问题可能会受到更适合回答的人的关注。
  • @bluefeet:他/她正在寻求“独立于数据库”的解决方案。
  • @a_horse_with_no_name 哎呀,我错过了。
  • 您使用哪种编程语言?使用 JDBC(也可能是 ODBC)时,您可以使用 {fn week({d '2031-03-15'})}(但不确定是否每个驱动程序都支持)

标签: sql date week-number database-agnostic


【解决方案1】:

似乎没有一个标准 SQL 函数可以从日期中提取周数 - 请参阅 here,了解不同 SQL 方言如何从日期字段中提取不同日期部分的比较。

【讨论】:

  • 谢谢!这有助于比较不同函数的“标准”。
【解决方案2】:

你可以试试这个。

声明@date 日期时间 选择@date='2013-03-15 00:00:00' select 'Week No: '+ convert(varchar(10),datepart(wk,@date)) as weekno

【讨论】:

  • 这绝对是独立于数据库的。
  • @khush 谢谢,但这似乎是 MS SQL Server 特有的。
【解决方案3】:

试试这个: SELECT DATENAME(yy,GETDATE())+RIGHT(DATENAME(wk,GETDATE()),2)

要了解 DATENAME,请点击此链接:sqltutorials.blogspot.be/2007/05/sql-datename.html,右侧链接为suite101.com/article/sql-functions-leftrightsubstrlengthcharindex-a209089。有例子可以更好地理解;-)它可以在MS和其他sql服务器上正常工作;-)

【讨论】:

  • 除了我不完全理解这应该做什么之外,您的示例是否仅适用于 MS SQL Server?我需要一个也适用于其他数据库的解决方案。
  • 您应该将此信息编辑到您的答案中(不仅仅是链接,里面的主要信息也是如此)
  • @clement 在我看来 DATENAME() 是 MS SQL Server 唯一的函数。 RIGHT() 似乎也不是很独立。至少Oracle 10g 不知道。 (顺便说一句:我到底从哪里获得 SQL 标准的完整规范!?找出哪些函数是数据库特定的,哪些不是。)
  • 如果你能在 sql、pl-sql +oracle 中找到能做到这一点的 sql 语句,我会为你感到非常高兴!
  • @Radlan:完整的 ANSI 规范只有在您付费的情况下才可用。但是,如果您用 Google 搜索一下,就会发现一些带有草稿版本的 PDF。我不知道这是什么法律情况,所以我不打算发布链接
【解决方案4】:

我看到的唯一与数据库无关的解决方案是获取从今天到 1 月 1 日之间的天数。年。然后将其除以 7 并四舍五入。从 1 月 1 日到今天有 73 天,这给出了 10.43 作为周数。 ISO 周数是 11。

更正:当前一周的最后一天与当前时间的 1 月 1 日之间的天数。年。在这种情况下,ISO 周为 10,并且 68/7 = 10(四舍五入)。

【讨论】:

  • 手工操作也是可以的。但随后我必须在 SQL 中找出当前一周的最后一天,这将导致下一个问题。 ;-)
  • 您无法从月中提取周。您只能从日期或手动获取周数。唯一的非数据库解决方案就像我的示例中那样,因为它可以在任何数据库中完成。其余的是数据库特定的解决方案。提取日期,为日期提供正确的格式以获取周数。这些是您唯一的选择。
【解决方案5】:

我发现的最好的主意是

SELECT ROUND(((DAY(NOW())-1)/7)+1)

【讨论】:

    【解决方案6】:
    select (DATEPART(yyyy , CAST(GETDATE() AS datetime)) * 100 + 
            DATEPART(ww , CAST(GETDATE() AS datetime))) as week
    

    【讨论】:

    • 您能否在语法上突出显示您的帖子以使语句更具可读性?
    猜你喜欢
    • 2010-10-11
    • 2011-01-20
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多