【问题标题】:SQL Server: proper use of Select with calendar tableSQL Server:正确使用带日历表的 Select
【发布时间】:2014-04-28 10:31:26
【问题描述】:

我创建了一个日历表,其中包含一年中的所有日历日期,包括。对应的季度/周/月/日等信息。

下面的 Select 给了我 12 月的所有星期五。 在这里只获得第二个的最佳方法是什么?

SELECT     *
FROM       Calendar
WHERE      (yearCal = '2014') AND (monthCal = '12') AND (weekDayCal = '6')

非常感谢,迈克。

【问题讨论】:

  • 我建议添加日期的各种 ISO 8601 值(ISO 周年、ISO 周年、ISO 周日等),尤其是当您的星期几时 与 ISO 编号匹配(您的星期一是 '2',ISO 星期一是 '1')。
  • @Clockwork-Muse - 不同的企业有不同的星期定义。
  • @MatBailie - 这正是我建议添加 ISO 编号的原因正是 - 所以如有必要,可以说明共同点。 ISO 定义的另一个好处是它们不受服务器区域更改(甚至只是会话区域更改)之类的影响。

标签: sql sql-server date stored-procedures calendar


【解决方案1】:

假设您有 day_of_month 类型的字段,则第二个星期五必须是第 8 天到第 14 天。

SELECT     *
FROM       Calendar
WHERE      (yearCal    = 2014)
       AND (monthCal   = 12)
       AND (weekDayCal = 6)
       AND (dayInMonth BETWEEN 8 AND 14)

您可以使用Week of month 字段,但这可能会变得复杂,具体取决于您定义为一周的时间。通常会在周一至周日或类似时间之前进行,这意味着 month12 中的 week1可能只有 2 天,不包括周五。

【讨论】:

  • 非常感谢。是的,我有,这很完美!我会尽快接受。
【解决方案2】:

如果这是一个重复的要求,那么您应该添加一个列 weekInMonthCal 并将其包含在约束子句中。

可以在 SQL 中进行计数,但由于这涉及到结果集中的聚合,因此成本很高。

【讨论】:

    【解决方案3】:

    您可以使用ROW_NUMBER() 函数对结果进行排序(将DateColumn 列替换为存储日期的列。然后您可以获得第二条记录。

    WITH CTE AS
    (SELECT     Col1, Col2, Col3, ROW_NUMBER() OVER (ORDER BY DateColumn) RowNumber
    FROM       Calendar
    WHERE      (yearCal = '2014') AND (monthCal = '12') AND (weekDayCal = '6'))
    
    SELECT Col1, Col2, Col3 FROM CTE
    WHERE RowNumber = 2
    

    【讨论】:

      【解决方案4】:

      这会给你一个给定月份的第二个星期五

      SELECT TOP 1 *
      FROM
      (SELECT     top 2 *
      FROM       Calendar
      WHERE      (yearCal = '2014') AND (monthCal = '12') AND (weekDayCal = '6')
      order by dateCal asc) a
      order by dateCal desc
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-31
        • 1970-01-01
        • 1970-01-01
        • 2020-10-31
        • 1970-01-01
        • 1970-01-01
        • 2016-10-10
        • 1970-01-01
        相关资源
        最近更新 更多