Sql-Server

有人可以告訴這兩個日期比較有什麼區別嗎?

  • July 24, 2020

所以我有2個查詢如下:

f.DATE >= (GETDATE() - 3)

f.DATE >= CAST(CONVERT(VARCHAR(10),GETDATE() - 3,101) AS DATETIME)

我認為它們是相同的,但第二個比第一個給了我更多的行。f.DATE 的數據類型雖然是日期。

你能告訴我我哪裡弄錯了嗎?非常感謝!!

SQL Server GETDATE()函式返回執行時的確切日期和時間,包括秒/毫秒,即 2020-07-24 14:08:40.670。當查詢執行時,

獲取日期()-3

評估執行時的日期/時間減去 3 天,即 2020-07-21 14:08:40.670,因此只有 f.Date 大於/等於 2020-07-21 14:08 的項目: 40.670 將被退回。

在 GETDATE() 上使用樣式為 101 的 CONVERT 會返回格式為 mm/dd/yyyy 的日期。在你上面的例子中

CAST(轉換(VARCHAR(10),GETDATE() - 3,101)作為日期時間)

轉換(VARCHAR(10),GETDATE() - 3,101)

評估日期/時間,因為它在執行時減去 3 天,沒有任何時間部分,即 2020-07-21。然後將其轉換為日期時間時,時間部分預設為 00:00:00,即 2020-07-21 00:00:00.000。

由於第二個語句中的派生表達式早於第一個語句中的派生表達式,因此您可能會返回額外的行。

你不應該使用這兩種形式。這種 - 3速記是等待發生的定時炸彈(參見這篇文章這段影片),並且轉換為字元串並返回是從類型中剝離時間的最不有效的方法之一datetime(參見這篇文章)。

如果列是日期,則應在午夜從今天顯式減去 3 天,只需將“現在”轉換為date類型即可獲得:

WHERE f.DATE >= DATEADD(DAY, -3, CONVERT(date, GETDATE()));

順便說一句,您還應該避免使用保留字(如DATE)作為列名。

引用自:https://dba.stackexchange.com/questions/271573