[ad_1]
過去 30 から今日までのすべての行の記録を取得する必要があります。 私はこれを試しましたが、うまくいきません
私が試したこと:
date_time >= CONVERT(Varchar(100), DATEADD(DAY,-30,GETDATE()),103) および date_time <= CONVERT(varchar(100), getdate(),103) である dsr_data から date_time を選択します。
解決策 3
SELECT date_time FROM dsr_data WHERE date_time between DATEADD(DAY,-30,GETDATE()) and GETDATE();
解決策 1
なぜCONVERTを使用しているのですか?
考えられる唯一の理由は、機能しないのと同じ理由です。日付を DATE、DATETIME、または DATETIME2 ではなく NVARCHAR 列として保存しています。
文字列を比較する場合、比較は完全に 2 つの文字列の最初の異なる文字に基づいて行われます。日付を 103 形式 (「dd/MM/yyyy」) でフォーマットすることを明確に選択しているため、比較は完全にジャンクになります -たとえば、年は最後にチェックされます。したがって、比較は月の最初の桁に基づいており、’0′ は ‘1’ より小さいため、2017 年 1 月 31 日は 1952 年 12 月 31 日より前になります。
データベースを変更します。 常に適切なデータ型でデータを格納してください。つまり、整数値を INT 列に、日付情報を DATE、DATETIME、または DATETIME2 列に格納するなどです。 そうしないと、これはあなたを苦しめるのを待っている多くの厄介な、厄介な問題の最初の 1 つにすぎません…
解決策 2
以下のクエリを使用します。
SELECT date_time FROM dsr_data WHERE date_time >= DATEADD(day,-30, getdate()) and date_time <= getdate()
解決策 4
これは私にとってはうまくいきます。
テーブル (dsr_data) -> 名前 (date_time) -> タイプ (datetime) -> デフォルト (CURRENT_TIMESTAMP)
SELECT date_time FROM dsr_data WHERE date_time >= DATE(adddate(curdate(), interval -30 day)) and date_time <= DATE(curdate())
[ad_2]
コメント