2011-12-28 2 views
5

Я хочу, чтобы выбрать несколько записей на основе года согласования, например, в таблице вкладку где столбцы [id] int, [name] varchar, [bookyear] datetimeDateTime запрос только на год в SQL Server

Я хочу, чтобы выбрать все записи, год в 2009

следующий запрос дает 0 результат:

SELECT [ACCNO] 
     ,[Roll No] 
     ,[IssueDate] 
     ,[DueDate] 
    FROM [test1].[dbo].[IssueHis$] 
    where [IssueDate] between 12-12-2004 and 1-01-2010 
+0

Как это может быть помечено как MySQL и SQL-сервер? – rene

+1

Посмотрите на функцию DATEPART - http://msdn.microsoft.com/en-us/library/ms174420.aspx - вы можете сделать вкладку SELECT * FROM. ГДЕ DATEPART (year, IssueDate) BETWEEN 2005 И 2010, например , Множество примеров на SO тоже, см. Http://stackoverflow.com/questions/5043920/sql-server-given-a-year-find-everything-inclusive-from-the-year-previous-and – dash

+0

Я прибрал теги @rene, так как ясно, что речь идет о SQL Server. – dash

ответ

19
select id,name,bookyear from tab1 where year(bookyear) = 2009 
+1

Qeustion был отредактирован: когда я читал, есть только так, я хочу выбрать все записи, где год 2009, поэтому мой запрос-сервер в этой цели. – dotnetstep

4
SELECT [ACCNO] 
    ,[Roll No] 
    ,[IssueDate] 
    ,[DueDate] 
FROM [test1].[dbo].[IssueHis$] 
WHERE [IssueDate] >= '20090101' AND 
     [IssueDate] < '20100101' 
4
  1. Вам необходимо разграничить даты-времени константы, как вы бы строка
  2. Используйте yyyymmdd шаблон для SQL Server (не yyyy-mm-dd, это небезопасно в целом)
  3. Используйте запросы надлежащего диапазона для обеспечения значения времени

Таким образом, чтобы найти значения между "12 декабря 2004" и "31 декабря 2009" включительно, что позволяет время:

... 
where [IssueDate] >= '20041212' AND [IssueDate] < '20100101' 

Edit, или это из-за неопределенности в вопросе на «год = 2009»

... 
where [IssueDate] >= '20090101' AND [IssueDate] < '20100101' 
+0

+1 для объяснения, а также, спасибо за упоминание функции может негативно повлиять на производительность запросов и индексы.Я не знал, что так у меня есть, чтобы прочитать :-) – dash

+2

@ dash: № 2 здесь http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming -mistakes/ – gbn

2

Одним из самых важных вещей, чтобы помнить в отношении SQL Server и фиников, что лучший формат Используйте это: 'YYYYMMDD' (или 'YYYYMMDD HH:MI:SS'). Этот формат всегда будет правильно интерпретироваться SQL Server, независимо от региональных настроек даты.

SELECT [ACCNO] 
     ,[Roll No] 
     ,[IssueDate] 
     ,[DueDate] 
    FROM [test1].[dbo].[IssueHis$] 
WHERE [IssueDate] >= '20090101' 
    AND [IssueDate] < '20100101' 
+0

Необходимо следить, имеет ли IssueDate значение времени, конечно ... – gbn

+0

@gbn Хорошая точка. –

2

Вы можете создать представление, которое имеет IssueYear в отдельной колонке

CREATE VIEW vIssueHis 
AS 
SELECT 
[ACCNO], 
[Roll No], 
[IssueDate], 
[DueDate], 
DATEPART(yyyy,IssueDate) as IssueYear, 
DATEPART(yyyy,DueDate) as DueYear 
FROM [test1].[dbo].[IssueHis$]

Тогда вы можете запросить мнение как этот

SELECT [ACCNO] 
     ,[Roll No] 
     ,[IssueDate] 
     ,[DueDate] 
FROM vIssueHis 
WHERE IssueYear = 2009
0

Вы можете сделать

.... 
WHERE [IssueDate] > '2004' AND [IssueDate] < 2010