私は2つの日付を比較するために次の方法を使用しています:
if CONVERT(varchar(20), @ScheduleDate, 101) >= CONVERT(varchar(20), @CurrentDateTime, 101)
12/31/2012
これは今年は問題なく機能していますが、ある日付のように毎年入ってきた場合は1/1/2013
機能しません。
どうすればこれを解決できるか教えてください。
私は2つの日付を比較するために次の方法を使用しています:
if CONVERT(varchar(20), @ScheduleDate, 101) >= CONVERT(varchar(20), @CurrentDateTime, 101)
12/31/2012
これは今年は問題なく機能していますが、ある日付のように毎年入ってきた場合は1/1/2013
機能しません。
どうすればこれを解決できるか教えてください。
なぜ文字列を比較するのですか?日付を比較できます
if @ScheduleDate >= @CurrentDateTime
しかし、あなたの日付に時間が含まれている場合、私は通常
if convert(nvarchar(8), @ScheduleDate, 112) >= convert(nvarchar(8), @CurrentDateTime, 112)
112日時形式はYYYYMMDDであるため、日付の比較に適しています
文字列の比較は左から右であるため、「1/....」は「12/...」よりも小さいことを覚えておく必要があります。
文字列の比較ではなく、DATETIMEの比較を使用する必要があります。
何かのようなもの
DECLARE @ScheduleDate DATETIME = '1/1/2013',
@CurrentDateTime DATETIME = '12/31/2012'
IF (@ScheduleDate >= @CurrentDateTime)
BEGIN
SELECT @ScheduleDate, @CurrentDateTime
END
DECLARE @ScheduleDateString VARCHAR(20) = '1/1/2013',
@CurrentDateTimeString VARCHAR(20) = '12/31/2012'
IF (CONVERT(DATETIME,@ScheduleDateString,101)>=CONVERT(DATETIME,@CurrentDateTimeString,101))
BEGIN
SELECT CONVERT(DATETIME,@ScheduleDateString,101),CONVERT(DATETIME,@CurrentDateTimeString,101)
END
変数がすでに日時である場合は、それらを変換する必要がないことに注意してください。
両方の変数が現在DateTime変数であると仮定すると、文字列に変換せずにそれらを比較することはできませんか?
declare @ScheduleDate DATETIME, @CurrentDateTime DATETIME
SET @ScheduleDate = '1 Jan 2013'
SET @CurrentDateTime = GetDate()
IF (@ScheduleDate >= @CurrentDateTime)
BEGIN
SELECT 'Do Something'
END
ELSE
BEGIN
SELECT 'Do Something Else'
END
CONVERT(nvarchar(8)、@ ScheduleDate、112)関数を使用すると、日付ではなく文字列が返されます。
したがって、SQLServerで「112」DateFormatを使用すると、分離せずに「YMD」形式の文字列が返されます。クエリでその文字列を比較し、desire出力を取得します。
「ifCONVERT(nvarchar(8)、@ScheduleDate、112)> = CONVERT(nvarchar(8)、@CurrentDateTime、112)」など
フォーマットされた文字列を比較するためにCONVERTを使用しません。遅いです(まあ、マイクロ秒のようですが、それでも)
バージョン2008より前のSQLにUDFを使用しています
CREATE FUNCTION [dbo].[DateOnly] (@Date DateTime)
RETURNS Datetime AS
BEGIN
Return cast (floor (cast (@Date as float)) as DateTime)
END
バージョン>=2008の場合、このアプローチ
convert(@MyDateTime as DATE)を選択します
もちろん、日時の値を直接比較することもできますが、2つの日時の値が同じ日付にあるかどうかを知るために(時間コンポーネントを無視して)、上記のバージョンが有効であることが証明されています。
日付:次の形式の開始と終了
SQLステートメントのWHEREa.DateCreated>= CAST('#from_date#' AS DATE)およびa.DateCreated <= CAST('#to_date#' AS DATE)
これは、元の日時列のキャストがなくても正常に機能しています