2016-07-13 11 views
0

私は日付の列を持つテーブルを持っています。この列はINTで、日付はYYYYMMDD(20160713など)の形式です。今、これらの日付が今日の後にあるすべての行を取得したいと思います。日付と状態を追加するSQL形式のINT

SELECT ID, startdate, comment 
FROM comments 
WHERE startdate > getdate 

しかし、それは次のエラーのためになり:

Arithmetic overflow error converting expression to data type datetime.

は、だから私はDD/MM/YYYY形式にフォーマットすることにより、

CONVERT(VARCHAR(10), (convert(date,CONVERT(varchar(10),[startdate],103))),103) > getdate() 

が、それを試してみました、私は次のことを試してみましたこのエラーが発生する:

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

どのようにこれを行うにはどのようなアイデア?

+6

読むアーロンバートランドさん[キックする悪い習慣:間違ったデータタイプを選択](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/bad-habits-to-kick- use-the-wrong-data-type.aspx) –

答えて

2

クエリ

SELECT 
    ID, 
    startdate, 
    comment 
FROM 
    comments 
WHERE 
    stadate > CAST(CONVERT(varchar(8),getdate(),112) AS INT) 
に、次の試してみてください
+0

私は1000行を持っている場合、getdate()は1000回または1回だけ変換されますか?より多くの場合は、変数を使用すると、より良い変換 – NEER

+0

この違いは実際にわずか1000行ではごくわずかです。クエリがたくさん実行された場合や、何百万もの行があった場合には大きな違いに気づくでしょうが、主に繰り返しキャスト/コンバートが原因です。 – ZLK

0

これを試してみてください:

SELECT ID, startdate, comment 
FROM comments 
WHERE CAST(startdate AS DATE) > getdate() 
+1

startdateが本当にintの場合、これは日付にキャストされませんが、CAST(CAST(AS AS VARCHAR(8))の開始日)AS DATE) ' –

+0

@ AllanS.Hansenここをクリック[SQLFiddle demo](http://sqlfiddle.com/#!9/9e22e/1) – Blank

+1

'YYYYMMDDまたはYYMMDD形式の数字ですが、その数字は日付として意味があります。たとえば、19830905と830905は '1983-09-05'と解釈されます。[** REFERENCE **](http://dev.mysql.com/doc/refman/5.7/en/datetime.html)。 @AllanS.Hansen – 1000111

0
SELECT ID, startdate, comment 
FROM comments 
WHERE CAST(STR(startdate) AS DATE) > getdate() 
+1

列に関数を適用しないでください。それは悪いパフォーマンスを与える – Squirrel

0

SELECT ID, startdate, comment 
FROM comments 
WHERE startdate > CONVERT(INT, CONVERT(VARCHAR(8), getdate, 112)) 

Iを整数にGETDATE()を列に変換するが、変換しません。他の人が日付の間違ったデータ型を使用しているとコメントしているはずです。 ...だから私はそれについては何も言及しません:)

2

あなたのint値をキャストしようとすることができますが、クエリはあなたのstartdateにある可能性のあるインデックスを使用することはできませんカラム。
他のオプションの日付があなたのint型の形式と一致するint型の値にGETDATE()から返される変換することです:GetDate()は1回だけ実行され

DECLARE @Now datetime = GETDATE(); 
DECLARE @NowInt int = YEAR(@Now) * 10000 + MONTH(@Now) * 100 + DAY(@Now); 

SELECT ID, startdate, comment 
FROM comments 
WHERE startdate > @NowInt; 

この方法では、int型への変換も、一度だけ実行されますクエリにはstartdateのインデックスを使用できます。

1

getDateintに変換する方が簡単です。

cast(format(getDate(),'yyyyMMdd') as int) 
関連する問題