【问题标题】:SQL Server: check if certain date in calendar table falls on a weekendSQL Server:检查日历表中的某个日期是否在周末
【发布时间】:2014-06-13 23:10:45
【问题描述】:

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

下面的 Select 给了我一个具体的日期,这里是 3 月 17 日。 如何扩展以下内容以检查这是否属于星期六或星期日 (weekDayCal = 7 or 1),如果为真,则返回下星期一的日期,否则返回 17 日?

SELECT     *
FROM       Calendar
WHERE      (yearCal = 2014) AND (monthCal = 3) AND (dayCal = 17)

非常感谢您在此提供的任何帮助,迈克。

【问题讨论】:

  • 您的日历是否有顺序 ID?也许是一个day_of_calendar 字段,其中每个 日期都按完美的顺序排列?
  • 谢谢,不幸的是,只有我的年、月和周有唯一的 ID。

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


【解决方案1】:

假设您有一个 day_of_calendar 样式的 id 字段,其中每个日期都按顺序排列,那么这可行...

SELECT *
  FROM Calendar
 WHERE id = (SELECT id + CASE weekDayCal WHEN 7 THEN 2 WHEN 1 THEN 1 ELSE 0 END
               FROM Calendar
              WHERE (yearCal = 2014) AND (monthCal = 3) AND (dayCal = 17)
            )

如果不是,那么您将不得不重新以一种或另一种方式使用日期。

例如...

SELECT *
  FROM Calendar
 WHERE realDate = (SELECT realDate + CASE weekDayCal WHEN 7 THEN 2 WHEN 1 THEN 1 ELSE 0 END
                     FROM Calendar
                    WHERE (yearCal = 2014) AND (monthCal = 3) AND (dayCal = 17)
                  )

但是您也可以只使用实际日期计算。

【讨论】:

  • 非常感谢 - 第二种解决方案正是我想要的。我会尽快接受。
【解决方案2】:

我认为这应该可行,如果您确实有一个 weekDayCal 列,其中 1 = 星期日、2 = 星期一和 7 = 星期六:

SELECT     *
FROM       Calendar
WHERE      (yearCal = 2014) AND (monthCal = 3) AND (
   (dayCal = 17 and weekDayCal not in (1,7)) OR
   (dayCal = 17 + 1 and weekDayCal = 2) OR
   (dayCal = 17 + 2 and weekDayCal = 2))

【讨论】:

    【解决方案3】:

    这会获取星期天或星期六的行

    SELECT *
    FROM Calender
    WHERE DATEPART(dw, CAST( 
                            CAST(monthCal as VARCHAR(2))+ '-'+
                            CAST(dayCal as VARCHAR(2))+'-'+
                            CAST(yearCal as VARCHAR(4))
    
                            AS DATETIME
                            )
                   ) IN(1,7)
    

    【讨论】:

    • 我怀疑DATENAME(dw,...) 是否会返回一个匹配17 的值。
    • 这根本不符合 OP 的要求。 OP 希望year=2014, month=3, day=17 或之后的第一个非周末日期。
    • 谢谢。我不能只使用 CASE 语句吗?只是尽量保持简短,因为我需要在同一过程中检查多个日期。
    • 日期名称为星期日、星期六 ... datepart 给出 1,7 .. 对不起我的错误
    • 即使是编辑也没有意义。由于 Calendar 表已经有一个 weekDayCal 字段,您所写的只是:SELECT * FROM Calendar WHERE weekDayCal IN (1,7) 这对 OP 没有任何帮助。我希望我能投反对票两次。
    猜你喜欢
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多