Запрос DateTime только на год в SQL Server - PullRequest
8 голосов
/ 28 декабря 2011

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

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

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

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

Ответы [ 7 ]

25 голосов
/ 28 декабря 2011
select id,name,bookyear from tab1 where year(bookyear) = 2009
4 голосов
/ 28 декабря 2011
  1. Вам необходимо разделить константы даты и времени, как если бы вы были строкой
  2. Использовать шаблон yyyymmdd для SQL Server (не yyyy-mm-dd, это вообще небезопасно)
  3. Использовать правильнодиапазон запросов для разрешения значения времени

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

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

Правка, или это, из-за двусмысленности вопроса "год = 2009"

...
where [IssueDate] >= '20090101' AND [IssueDate] < '20100101'
4 голосов
/ 28 декабря 2011
SELECT [ACCNO]
    ,[Roll No]
    ,[IssueDate]
    ,[DueDate]
FROM [test1].[dbo].[IssueHis$] 
WHERE [IssueDate] >= '20090101' AND
      [IssueDate] < '20100101'
2 голосов
/ 29 декабря 2011

Вы можете создать представление, которое имеет 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
2 голосов
/ 28 декабря 2011

Одна из самых важных вещей, которые следует помнить в отношении 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 голосов
/ 09 апреля 2018
where YEAR(IssueDate) = '2009'

Ссылка

0 голосов
/ 14 сентября 2014

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

....
WHERE [IssueDate] > '2004' AND [IssueDate] < 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...