web-dev-qa-db-ja.com

SQLServerの1年のみのDateTimeクエリ

たとえば、列が[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
8
user1074474
select id,name,bookyear from tab1 where year(bookyear) = 2009
29
dotnetstep
SELECT [ACCNO]
    ,[Roll No]
    ,[IssueDate]
    ,[DueDate]
FROM [test1].[dbo].[IssueHis$] 
WHERE [IssueDate] >= '20090101' AND
      [IssueDate] < '20100101'
4
Mikael Eriksson
  1. 文字列のように日時定数を区切る必要があります
  2. SQLServerにはyyyymmddパターンを使用します(yyyy-mm-ddではなく、一般的に安全ではありません)
  3. 適切な範囲クエリを使用して、時間値を考慮します

したがって、「2004年12月12日」と「2009年12月31日」の間の値を見つけるには包括的、時間を考慮して:

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

「year = 2009」の質問があいまいなため、編集またはこれ

...
where [IssueDate] >= '20090101' AND [IssueDate] < '20100101'
4
gbn

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

SQL Serverと日付に関して覚えておくべき最も重要なことの1つは、使用するのに最適な形式は次のとおりです。'YYYYMMDD'(または'YYYYMMDD HH:MI:SS')。この形式は、地域の日付設定に関係なく、SQLServerによって常に適切に解釈されます。

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

できるよ

....
WHERE [IssueDate] > '2004' AND [IssueDate] < 2010
0
iYazee6
where YEAR(IssueDate) = '2009'

参照

0
Saeid Ostad