2017-01-24 1 views
1

私は前日のデータを返すこの簡単なクエリを持っています。平日の前日のレコードを引き出す方法は?

SELECT * FROM mytable 
WHERE DATEDIFF(day,CONVERT(datetime,mytable.mydate, 121),GETDATE()) = 1 

このクエリの使用は、前日が日曜日であるため日曜日にデータが存在しないため、月曜日に問題になります。

だから私はこれを行う方法を任意のアイデア月曜日

上の金曜日のデータを取得するためのクエリ(最後の活性)をご希望ですか?

日付のデータ型についてちょっと注意してください。日付フィールドのデータ型はVARCHARです。

私はデータベースを継承し、現在10年以上使用されています。

ご協力いただきありがとうございます。

+1

本当に 'mydate'は' varchar() 'ですか?日付は日付/時刻として保存する必要があります。 –

+0

@ GordonLinoff、はい、残念ながらvarcharです。私の元の投稿に示されているように、私はこれを継承しました。私は決して文字列またはvarcharとして日付を格納しません。 – Tairoc

答えて

3

これはいかがですか?

SELECT TOP 1 WITH TIES t.* 
FROM mytable t 
WHERE mydate < CAST(getdate() as DATE) -- assume mydate is a date 
ORDER BY CAST(mydate as DATE) DESC; 

これは、データが存在する任意の日のために、表の中で最も最近の日のデータを取得します。

EDIT:

どうやら、mydateはvarchar型に格納されます。これは悪い考えですが、もしあなたがそれをやろうとするなら、フォーマット121は非常に良い選択です。私は上記を次のように変更します:

SELECT TOP 1 WITH TIES t.* 
FROM mytable t 
WHERE mydate < CONVERT(VARCHAR(10), getdate(), 121) 
ORDER BY LEFT(mydate, 10) DESC; 

注:これは、日付と文字列の比較を行います。しかし、日付はYYYY-MM-DDという形式になっているので、これは大丈夫です。これは同等です。パフォーマンスに問題がある場合は、列のインデックスを使用して計算された列mydate(日時または日付に変換する)をお勧めします。

+0

'where'節の' mydate'の 'cast'は' varchar'なので? –

+1

@vkp - RHSは 'Date'なので、LHSは内部的に' DATE'に変換されます。 'DATE'は' varchar'よりも高い優先順位を持っています –

+0

ありがとう@Prdp ..それは分かりませんでした。 –

1

あなたはこのようなものを試すことができます。それは、週の最初の日に日曜日に休みます。

SELECT * FROM mytable 
WHERE DATEDIFF(day,CONVERT(datetime,mytable.mydate, 121),GETDATE()) = case datepart(dw, GETDATE()) 
when 2 then 3 --read 3 days back on a monday 
when 1 then 2 --read 2 days back on a sunday 
else 1 end 
+0

ありがとうございます。 私は土曜日のビットを理解しません。あなたは光を放つことができますか? 土曜日と日曜日は通常、月曜日から金曜日のデータはありません。 – Tairoc

+0

土曜日ではなく、日曜日を読むべきです、ごめんなさい – edosoft

0

datetime変数を宣言し、そして、DATEPART()と、(クエリが実行されている日)で週GETDATE()のどの日に決定。次に、月曜日に、負の2日間で日付を変更します。

declare @queryDate datetime; 
set @queryDate = case when DATEPART(dw, GETDATE()) = 1 then DATEADD(d, -2, GETDATE()) else GETDATE() end; 
select * from mytable 
where DATEDIFF(day,CONVERT(datetime,mytable.mydate, 121),@queryDate) = 1 
関連する問題