获取特定月份的所有记录 - 构建SQL查询

时间:2010-01-13 07:39:29

标签: asp.net sql sql-server sql-server-2005

我需要一些帮助来构建SQL Query。我的表有如下数据:

ID  Date        Name
1   1/1/2009    a
2   1/2/2009    b
3   1/3/2009    c

我需要得到类似......的结果。

1    1/1/2009    a
2   1/2/2009    b
3   1/3/2009    c
4   1/4/2009    Null
5   1/5/2009    Null
6   1/6/2009    Null
7   1/7/2009    Null
8   1/8/2009    Null
............................
............................
............................
30  1/30/2009   Null
31  1/31/2009   Null

我想查询类似的东西。

Select * from tbl **where month(Date)=1 AND year(Date)=2010**

以上未完成查询。

我需要获得特定月份的所有记录,即使某个日期缺失......

我想必须有equi加入查询,我正在尝试使用Equi join构建此查询

由于

3 个答案:

答案 0 :(得分:5)

BIG EDIT

现在了解OP的问题。

使用公用表表达式和左连接来获得此效果。

DECLARE @FirstDay DATETIME;

-- Set start time
SELECT @FirstDay = '2009-01-01';

WITH Days AS 
(
  SELECT @FirstDay as CalendarDay
  UNION ALL
  SELECT DATEADD(d, 1, CalendarDay) as CalendarDay
  FROM Days
  WHERE DATEADD(d, 1, CalendarDay) < DATEADD(m, 1, @FirstDay)
)
SELECT DATEPART(d,d.CalendarDay), **t.date should be (d.CalendarDay)**, t.Name  FROM Days d
LEFT JOIN tbl t
ON
  d.CalendarDay = t.Date
ORDER BY 
  d.CalendarDay;

将此原始答案留在底部

您需要 DATEPART ,先生。

SELECT * FROM tbl WHERE DATEPART(m,Date) = 1

如果您想选择月份和年份,那么您可以使用DATEPART两次或去一个范围。

SELECT * FROM tbl WHERE DATEPART(m,Date) = 1 AND DATEPART(yyyy,Date) = 2009

范围: -

SELECT * FROM tbl WHERE Date >= '2009-01-01' AND Date < '2009-02-01'

有关DATEPART的更多信息,请参阅此链接。

http://msdn.microsoft.com/en-us/library/ms174420.aspx

答案 1 :(得分:1)

您可以使用少于或等于。

像这样:

select * from tbl where date > '2009-01-01' and date < '2009-02-01'

但是,目前还不清楚你是否想要所有年份的第1个月?

您可以在MSDN上的“Date and Time Functions”上查看更多示例和功能

答案 2 :(得分:1)

创建一个临时表,其中包含该月的所有日期,

在tempTable.month = #month上,在该表和数据表之间留下外连接。

现在你有一个大表,其中包含所需月份的所有日期以及与正确日期匹配的所有记录以及没有数据的那些日期的空记录。

我希望这就是你想要的。