2015-08-25 165 views
0

我有一個查詢,比較日期,是這樣的:Sql Server的轉換日期

SELECT * FROM TABLE WHERE MYDATETIME < @DATE 

列MYDATETIME是一個DATETIME列,但是當我從網絡形式收到的日期我收到它的日期格式,在PHP創建一個DateTime對象:

$date = DateTime::createFromFormat('d/m/Y',$date); 

的問題是當查詢比較所使用一天的時間以及日期,但是當我在PHP創建之日起就得到了系統的時間。

我只想比較日期,而不是一天中的時間。

哪個選項是對數據庫的性能更好,使用PHP創建對象:

DateTime::createFromFormat('d/m/Y H:i', $date." 00:00"); 

或查詢轉換?

SELECT * FROM TABLE WHERE CONVERT(DATE,MYDATETIME) < CONVERT(DATE, @DATE) 
+0

這可能是一個嚴重的設計缺陷。留下您的數據庫與日期時間,並讓網絡表單推送日期時間。 Boom done – FirebladeDan

+0

我需要表中其他原因的日期時間,但webform中的字段必須是Date,因爲我想獲取特定日期範圍的記錄,忽略時間 –

+0

如果要使用數據庫選項(其中我認爲很好),確保你在那裏創建了正確的索引。如果您在MyDateTime上有索引,那麼將其轉換爲不會包含這些索引。 – Sagar

回答

0

我認爲你基本上在你原來的問題軌道上。構建DateTime對象,將時間組件設置爲00:00:00,然後直接與數據庫中的MYDATETIME字段進行比較。

這可能是你提議或完成做這樣的事情:

$datetime = DateTime::createFromFormat('d/m/Y',$date); 
$datetime->setTime(0,0,0); 
$date_string_for_db_compare = $datetime->format('Y-m-d H:i:s'); 
0

邁克是說明你需要傳遞變量的數據庫字段的默認格式正確無誤。這會爲您提供查詢中的最佳性能。每當在where子句的數據庫字段上使用cast/convert函數時,將不會使用該字段的索引。我會添加Mikes的建議,您使用> =和<,以便您可以捕獲在24小時內發生的所有交易。

請參閱下面的示例。

SELECT 
    FieldA 
    FieldB, 
    MyDateTime 
FROM 
    TABLE 
WHERE 1=1 
    and MyDateTime >= '2015-08-30 00:00:00' 
    and MyDateTime < '2015-08-31 00:00:00' 

希望這有助於 傑森