SQL Server:与日历表一起正确使用Select
我创建了一个日历表,其中包含一年中的所有日历日期,包括相应的季度/周/月/日等信息 下面的选择给了我十二月的所有星期五。 在这里,最好的办法是什么,才能得到第二个呢SQL Server:与日历表一起正确使用Select,sql,sql-server,date,stored-procedures,calendar,Sql,Sql Server,Date,Stored Procedures,Calendar,我创建了一个日历表,其中包含一年中的所有日历日期,包括相应的季度/周/月/日等信息 下面的选择给了我十二月的所有星期五。 在这里,最好的办法是什么,才能得到第二个呢 SELECT * FROM Calendar WHERE (yearCal = '2014') AND (monthCal = '12') AND (weekDayCal = '6') 谢谢你,迈克 如果这是一个重复性要求,则应添加一列weekInMonthCal,并将其包含在约束子句中 可以在SQL
SELECT *
FROM Calendar
WHERE (yearCal = '2014') AND (monthCal = '12') AND (weekDayCal = '6')
谢谢你,迈克 如果这是一个重复性要求,则应添加一列
weekInMonthCal
,并将其包含在约束子句中
可以在SQL中进行计数,但由于这涉及结果集中的聚合,因此成本很高。假设您有一个
day\u/u month
类型的字段,第二个星期五必须是第8天到第14天
SELECT *
FROM Calendar
WHERE (yearCal = 2014)
AND (monthCal = 12)
AND (weekDayCal = 6)
AND (dayInMonth BETWEEN 8 AND 14)
您可以使用
月中的周
字段,但这可能会变得复杂,具体取决于您对周的定义。通常是星期一、星期天或类似的时间,这意味着月12日的周1
可能只持续2天,不包括星期五。您可以使用行数()
函数对结果进行排序(将列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
这将给你一个月的第二个星期五
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
非常感谢。是的,我有,这很好用!我会尽快接受。我建议添加日期的各种值(ISO周年、ISO周年、ISO周日等),特别是当您的周日与ISO编号不匹配时(您的周一是'2'
,ISO周一是'1'
).@Clockwork Muse-不同的企业有不同的周定义。@MatBailie-这正是我建议添加ISO编号的原因-因此可以在必要时说明共同点。ISO定义的另一个好处是,它们不受服务器区域更改(甚至只是会话区域更改)的影响。