我需要一些帮助来构建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构建此查询
由于
答案 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的更多信息,请参阅此链接。
答案 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上,在该表和数据表之间留下外连接。
现在你有一个大表,其中包含所需月份的所有日期以及与正确日期匹配的所有记录以及没有数据的那些日期的空记录。
我希望这就是你想要的。