2010-01-13 106 views
0

我需要一些帮助来构建SQL查询。我已经有数据表所示:获取特定月份的所有记录 - 构建SQL查询

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** 

上面没有完成查询。

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

我想一定是相等加入查询,我想建立使用此查询相等加入

感谢

+0

好吧,我想我知道你现在在这里之后。 即使所有可能的日期都在一个月内,即使它们不存在于您的表格中,也是如此? – 2010-01-13 07:51:32

+0

见下文。目前无法访问SQL 2005,但大约需要30分钟。如果该查询有任何问题,请告诉我。 (日期)= 1 =月份(日期)= 1 – 2010-01-13 08:01:21

回答

5

BIG编辑

现在明白了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

+0

查询和我的查询没有区别,两者都会返回相同的。无效的列名称'CalendarDay'。 – 2010-01-13 07:47:37

+0

ORDER BY t.CalendarDay; – 2010-01-13 08:10:43

+0

现在分类。在ORDER BY – 2010-01-13 08:13:43

1

您可以使用小于或等于。

像这样:

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

但是,如果你想要月1所有年,目前还不清楚?

您可以查看更多的例子和功能的“Date and Time Functions”从MSDN

+0

我已经写了更好的查询,都将返回相同的,但我需要得到该月份 – 2010-01-13 07:48:47

+0

看我提供的文档中的所有记录,你的答案是存在的,在回答你现在看到。 – 2010-01-13 07:53:56

1

创建包含某些月份的所有天的临时表,

不要左外那张桌子上不是Temptable数据表之间的连接.month =#月。

现在你有一张大桌子,所有月份的所需月份和所有记录匹配正确的日期+没有数据的那些日期的空记录。

我希望这就是你想要的。

相关问题