2017-10-19 4 views
0

1997年に生まれていないユーザは誰ですか?SQLでYEARのNOT IN文を書く方法

SELECT userFname, userLname, userDOB 
FROM user 
WHERE userDOB IN YEAR(1997); 

私は間違っていますか?私はuserDOB推測している

+1

[userDOB]値のいずれかが空であるか、NULLであるか、それ以外の日付/時刻データ型ではありませんか?そのようなものに対応する必要があるかもしれません。また、私はYEAR(userDOB)で構文を使用します!= 1997 – codemaker

答えて

3

は日である

SELECT userFname, userLname, userDOB 
FROM user 
WHERE YEAR(userDOB) NOT IN (1997); 
0
あなたの日付列を変換し、あなたがチェックいくつかの値のためではないで使用することができるためにあなたがtrhe YEAR()関数を使用する必要があります

SELECT userFname, userLname, userDOB 
FROM user 
WHERE year(userDOB) NOT IN (1997, 1998); 

が、価値があるだけの場合はINは必要ないが、それ以外の場合は

SELECT userFname, userLname, userDOB 
FROM user 
WHERE year(userDOB) <> 1997; 
+0

@JamesDangもし私の答えが正しければそれをマークしてください...どういうわけかここにあります http://meta.stackexchange.com/questions/5234/how - 返事を受け入れる – scaisEdge

1

YEAR(yourDate)は、yourDateの年のみを返します。

その後、1997に生まれていないすべてののユーザーを見つけるために、単に

SELECT userFname, userLname, userDOB 
FROM user 
WHERE YEAR(userDOB) <> 1997 
1

私の純粋主義者の一部がYEAR機能を使用し、現在の答えに反対されています。どうして?関数を使用すると条件がインデックスを無視するため、その理由があります。

ので、それから、答えは範囲を作成する機能を使用するために、通常は次のとおりです。

SELECT userFname, userLname, userDOB 
FROM user 
WHERE userDOB >= CAST('1997-01-01' AS DATE) 
     AND userDOB < CAST('1998-01-01' AS DATE) 

を...あなたが実際に逆にしたい除いて、それでは、条件を切り替えてみましょう:

SELECT userFname, userLname, userDOB 
FROM user 
WHERE userDOB < CAST('1997-01-01' AS DATE) 
     OR userDOB >= CAST('1998-01-01' AS DATE) 

...この時点で私の純粋主義はそれほど重要ではありません。どうして?選択される可能性のある行のパーセンテージと、同じインデックスにある可能性の低いデータ(Check the third point here)があるためです。

関連する問題