Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:与日历表一起正确使用Select_Sql_Sql Server_Date_Stored Procedures_Calendar - Fatal编程技术网

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定义的另一个好处是,它们不受服务器区域更改(甚至只是会话区域更改)的影响。