1

私は2つの日付を比較するために次の方法を使用しています:

if CONVERT(varchar(20), @ScheduleDate, 101) >= CONVERT(varchar(20), @CurrentDateTime, 101)

12/31/2012これは今年は問題なく機能していますが、ある日付のように毎年入ってきた場合は1/1/2013機能しません。

どうすればこれを解決できるか教えてください。

4

6 に答える 6

5

なぜ文字列を比較するのですか?日付を比較できます

if @ScheduleDate >= @CurrentDateTime

しかし、あなたの日付に時間が含まれている場合、私は通常

if convert(nvarchar(8), @ScheduleDate, 112) >= convert(nvarchar(8), @CurrentDateTime, 112)

112日時形式はYYYYMMDDであるため、日付の比較に適しています

于 2012-11-26T05:48:44.587 に答える
2

文字列の比較は左から右であるため、「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

SQLフィドルデモ

変数がすでに日時である場合は、それらを変換する必要がないことに注意してください。

于 2012-11-26T05:46:34.900 に答える
1

両方の変数が現在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
于 2012-11-26T05:48:54.367 に答える
0

CONVERT(nvarchar(8)、@ ScheduleDate、112)関数を使用すると、日付ではなく文字列が返されます。

したがって、SQLServerで「112」DateFormatを使用すると、分離せずに「YMD」形式の文字列が返されます。クエリでその文字列を比較し、desire出力を取得します。

「ifCONVERT(nvarchar(8)、@ScheduleDate、112)> = CONVERT(nvarchar(8)、@CurrentDateTime、112)」など

于 2012-11-26T06:31:13.370 に答える
0

フォーマットされた文字列を比較するために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つの日時の値が同じ日付にあるかどうかを知るために(時間コンポーネントを無視して)、上記のバージョンが有効であることが証明されています。

于 2012-11-26T06:44:25.267 に答える
0

日付:次の形式の開始と終了

from_Date#= #dateformat( "#form.from#"、 "mm / dd / yyyy")

to_Date#= #dateformat( "#now()#" + 1、 "mm / dd / yyyy")

SQLステートメントのWHEREa.DateCreated>= CAST('#from_date#' AS DATE)およびa.DateCreated <= CAST('#to_date#' AS DATE)

これは、元の日時列のキャストがなくても正常に機能しています

于 2015-08-20T17:50:01.243 に答える