2016-04-27 35 views
0

開始日+開始時刻が現在の日時を超えていて、終了日+終了時刻が現在の日時を超えていないオブジェクトを取得しようとしています。すべての列がnvarcharであるため、現在のdatetimeをnvarcharに変換しようとしました。私もdatetime型に私の列を変換しようとしましたが、それも動作しません。SQLサーバーの日付時刻

コラム助けてください:

startDate - nvarchar (dd/mm/yyyy) 
startTime - nvarchar (hh:mm) 24 hr 
endDate - nvarchar(dd/mm/yyyy) 
endTime - nvarchar(hh:mm) 24hr 

を私はしてみましたが、日時betwweenたstartDate +のstartTimeとendDateに+のstartTime、 動作するように思われていません。

SELECT * FROM Promo 
WHERE membership = '1' 
AND promoStatus = '1' 
AND CONVERT(NVARCHAR, GetDate(), 101) + ' ' + 
      CONVERT(NVARCHAR, DATEPART(hh, GetDate())) + ':' + 
      RIGHT('0' + CONVERT(NVARCHAR, DATEPART(mi, GetDate())), 2) BETWEEN 
      startDate + ' ' + startTime 
AND endDate + ' ' + endTime 

私がしようとしませんでした他の方法:

SELECT * FROM Promo 
WHERE membership = '1' 
AND promoStatus = '1' 
AND startDate + ' ' + startTime <= CONVERT(NVARCHAR, GetDate(), 101) + ' ' + 
      CONVERT(NVARCHAR, DATEPART(hh, GetDate())) + ':' + 
      RIGHT('0' + CONVERT(NVARCHAR, DATEPART(mi, GetDate())), 2) 
AND endDate + ' ' + endTime >= CONVERT(NVARCHAR, GetDate(), 101) + ' ' + 
      CONVERT(NVARCHAR, DATEPART(hh, GetDate())) + ':' + 
      RIGHT('0' + CONVERT(NVARCHAR, DATEPART(mi, GetDate())), 2) 
+0

を試してみてください。 –

答えて

0

SELECT * 
FROM Promo 
WHERE 
    membership = '1' 
    AND promoStatus = '1' 
    AND CAST(CONVERT(VARCHAR(16), GETDATE(), 120) AS DATETIME) BETWEEN 
     CONVERT(DATETIME, @startDate, 103) + CONVERT(DATETIME, @startTime) 
     AND CONVERT(DATETIME, @endDate, 103) + CONVERT(DATETIME, @endTime) 

このライン:

CAST(CONVERT(VARCHAR(16), GETDATE(), 120) AS DATETIME) 

が、これはGETDATE()の秒とミリ秒の部分を取り除きます意味し、その分を現在の日付時刻を取得します。

そして、この行:

CONVERT(DATETIME, @startDate, 103) + CONVERT(DATETIME, @startTime) 

が新しいDATETIME値を形成するためにあなたの日付と時刻の変数を結合します。

適切なデータ型を使用してテーブルを設計する場合は、これで問題が解決できる可能性があることに注意してください。

+0

ありがとうございます!それは完全に動作します! – lel

0

は、サンプルデータと期待される結果を提供してください。この

SELECT * FROM Promo 
WHERE membership = '1' 
AND promoStatus = '1' 
AND CAST(CONVERT(VARCHAR(16), GetDate(), 120) AS DATETIME) 
    BETWEEN CONVERT(DATETIME, startDate + ' ' + startTime, 120) 
     AND CONVERT(DATETIME, endDate + ' ' + endTime, 120)