4

私は最近これに出くわしました:

SELECT
    'Y',
    ltrim(rtrim(upper(Newly_Eligible)))
FROM Table
WHERE 
    Id = 1
AND
    (Convert(datetime, Convert(varchar, GETDATE(),103),103)  
    BETWEEN
        Convert(datetime,Convert(varchar, [Start_Date],103),103)
    AND
        Convert(datetime, Convert(varchar, [End_Date] ,103),103))

Start_DateEnd_Dateそして明らかGETDATE()にすべてのdatetimeタイプです。なぜ彼はvarcharにキャストしてから、再び戻ったのですか?

4

3 に答える 3

4

時間を削除するために行われるため、同じ形式の日付のみを比較できます。これを行うにはいくつかの方法があり、上記はその 1 つです。

もう一つは

select cast(floor(cast(getdate() as float)) as datetime)
于 2012-04-18T03:33:11.697 に答える
4

これにより、日時から余分な時刻の値が切り捨てられ、日付の値だけが残ります。(キーは変換コード「103」です。)

于 2012-04-18T03:33:37.487 に答える
2

varchar とその逆の遅い日付変換が本当に好きではありません。

私はあなたのコードを書く他の2つの方法を提案します:

SQL サーバー 2005:

SELECT
    'Y'
    ltrim(rtrim(upper(Newly_Eligible)))
FROM table
WHERE 
    Id = 1
AND
    dateadd(day, datediff(day, 0,  getdate()), 0)
    BETWEEN
        dateadd(day, datediff(day, 0,  [Start_Date], 0)
    AND
    [End_Date] -- *

※比較対象のgetdateは時間部分を取り除いているため、同日のend_dateより大きくなることはありません

SQL サーバー 2008:

SELECT
    'Y',
    ltrim(rtrim(upper(Newly_Eligible)))
FROM table
WHERE 
    Id = 1
AND
    cast(GETDATE() as date)
BETWEEN
    cast([Start_Date] as date)
AND
    [End_Date]
于 2012-04-18T07:49:39.470 に答える