簡體   English   中英

查詢比較 SQL 中的日期

[英]Query comparing dates in SQL

我有一張表,上面寫着所有發生在 11 月的日期。 我寫了這個查詢

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
created_date <= '2013-04-12'

此查詢應返回在第 11 個月(11 月)發生的所有事情,因為它發生日期“2013-04-12”(12 月)之前

但它只返回發生在小於 04 (2013- 04 -12) 天的可用日期

難道它只是比較白天的部分? 而不是整個日期?

如何解決這個問題?

Created_date 是日期類型

日期格式默認為yyyy-dd-MM

而不是'2013-04-12',其含義取決於當地文化,使用被認為是文化不變格式的'20130412'。

如果你想與12月4 比較,你應該寫'20131204'。 如果你想與4月12 比較,你應該寫'20130412'。

SQL Server文檔中的寫國際Transact-SQL語句的文章解釋了如何編寫文化不變的語句:

使用其他API或Transact-SQL腳本,存儲過程和觸發器的應用程序應使用未分隔的數字字符串。 例如,yyyymmdd為19980924。

編輯

由於您使用的是ADO,因此最好的選擇是參數化查詢並將日期值作為日期參數傳遞。 這樣您就可以完全避免格式問題,並獲得參數化查詢的性能優勢。

UPDATE

要在文字中使用ISO 8601格式,必須指定所有元素。 引用datetime文檔的ISO 8601部分

要使用ISO 8601格式,必須以格式指定每個元素。 這還包括T,冒號(:)和格式中顯示的句點(。)。

......第二個組件的分數是可選的。 時間組件以24小時格式指定。

試試這樣吧

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
created_date <= '2013-12-04'

如果您僅與日期值進行比較,則將其轉換為日期(而不是日期時間 )將起作用

select id,numbers_from,created_date,amount_numbers,SMS_text 
 from Test_Table
 where 
 created_date <= convert(date,'2013-04-12',102)

在使用GetDate()函數期間,此轉換也適用

你把<=並且它也將捕獲給定的日期。 您可以用< only替換它。

請嘗試以下查詢

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
convert(datetime, convert(varchar(10), created_date, 102))  <= convert(datetime,'2013-04-12')

嘗試在日期之前和之后使用“#”,並確保您的系統日期格式。 也許“YYYYMMDD O YYYY-MM-DD O MM-DD-YYYY O使用'/ O \\'”

例如:

 select id,numbers_from,created_date,amount_numbers,SMS_text 
 from Test_Table
 where 
 created_date <= #2013-04-12#

日期格式為yyyy-mm-dd。 因此上述查詢正在查找早於12Apr2013的記錄

建議你通過將日期字符串設置為'2013-04-30'進行快速檢查,如果沒有sql錯誤,則確認日期格式為yyyy-mm-dd。

將它們轉換為相同格式的日期,然后您可以進行比較。 像這樣:

where convert(date, created_date,102) <= convert(date,                                  /*102 is ANSI format*/
                                                    substring('2013-04-12',1,4) + '.' + /*year*/
                                                    substring('2013-04-12',9,2) + '.' + /*month*/
                                                    substring('2013-04-12',6,2)         /*day*/
                                                ,102)

您還可以使用 to_char(column_name, 'YYYY-MM-DD) 更改格式

下面的查詢可用於查找 2013 年 11 月的記錄。

Select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where Month(created_date) = 11 and Year(created_date) = 2013

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM