电竞比分网-中国电竞赛事及体育赛事平台

分享

快速的了解mysql使用DATE列方面的問(wèn)題

 mac_tom 2009-07-17
DATE值的格式是'YYYY-MM-DD'。按照標(biāo)準(zhǔn)的SQL,不允許其他格式。在UPDATE表達(dá)式以及SELECT語(yǔ)句的WHERE子句中應(yīng)使用該格式。例如:
--------------
mysql> SELECT * FROM tbl_name WHERE date >= '2003-05-05';
---------------
為了方便,如果日期是在數(shù)值環(huán)境下使用的,MySQL會(huì)自動(dòng)將日期轉(zhuǎn)換為數(shù)值(反之亦然)。
 
它還具有相當(dāng)?shù)闹悄?,在更新時(shí)或在與TIMESTAMP、DATE或DATETIME列比較日期的WHERE子句中,允許“寬松的”字符串形式(“寬松形式”表示,任何標(biāo)點(diǎn)字符均能用作各部分之間的分隔符。
例如,'2004-08-15'和'2004#08#15'是等同的)。
 
MySQL還能轉(zhuǎn)換不含任何分隔符的字符串(如'20040815'),前體是它必須是有意義的日期。
***************************
 
使用<、<=、=、>=、>、或BETWEEN操作符將DATE、TIME、DATETIME或TIMESTAMP與常量字符串進(jìn)行比較時(shí),MySQL通常會(huì)將字符串轉(zhuǎn)換為內(nèi)部長(zhǎng)整數(shù),以便進(jìn)行快速比較(以及略為“寬松”的字符串檢查)。
但是,該轉(zhuǎn)換具有下述例外:
比較兩列時(shí)
 
將DATE、TIME、DATETIME或TIMESTAMP列與表達(dá)式進(jìn)行比較時(shí)
 
使用其他比較方法時(shí),如IN或STRCMP()。
 
對(duì)于這些例外情形,會(huì)將對(duì)象轉(zhuǎn)換為字符串并執(zhí)行字符串比較,采用該方式進(jìn)行比較.
-----------------------------------------------
為了保持安全,假定按字符串比較字符串,如果你打算比較臨時(shí)值和字符串,將使用恰當(dāng)?shù)淖址瘮?shù)。
 
對(duì)于特殊日期'0000-00-00',能夠以'0000-00-00'形式保存和檢索。
 
在MyODBC中使用'0000-00-00'日期時(shí),對(duì)于MyODBC 2.50.12或更高版本,該日期將被自動(dòng)轉(zhuǎn)換為NULL,這是因?yàn)镺DBC不能處理這類(lèi)日期。
由于MySQL能夠執(zhí)行前面所介紹的轉(zhuǎn)換,下述語(yǔ)句均能正常工作:
mysql> INSERT INTO tbl_name (idate) VALUES (19970505);
            mysql> INSERT INTO tbl_name (idate) VALUES ('19970505');
            mysql> INSERT INTO tbl_name (idate) VALUES ('97-05-05');
            mysql> INSERT INTO tbl_name (idate) VALUES ('1997.05.05');
            mysql> INSERT INTO tbl_name (idate) VALUES ('1997 05 05');
            mysql> INSERT INTO tbl_name (idate) VALUES ('0000-00-00');
            mysql> SELECT idate FROM tbl_name WHERE idate >= '1997-05-05';
            mysql> SELECT idate FROM tbl_name WHERE idate >= 19970505;
            mysql> SELECT MOD(idate,100) FROM tbl_name WHERE idate >= 19970505;
            mysql> SELECT idate FROM tbl_name WHERE idate >= '19970505';

但是,下述語(yǔ)句不能正常工作:

mysql> SELECT idate FROM tbl_name WHERE STRCMP(idate,'20030505')=0;

STRCMP()是一種字符串函數(shù),它能將idate轉(zhuǎn)換為'YYYY-MM-DD'格式的字符串,并執(zhí)行字符串比較。它不能將'20030505'轉(zhuǎn)換為日期'2003-05-05'并進(jìn)行日期比較。
如果你正在使用ALLOW_INVALID_DATES SQL模式,MySQL允許以?xún)H執(zhí)行給定的有限檢查方式保存日期:MySQL僅保證天位于1~31的范圍內(nèi),月位于1~12的范圍內(nèi)。

這樣就使得MySQL很適合于Web應(yīng)用程序,其中,你能獲得三個(gè)不同字段中的年、月、日值,也能準(zhǔn)確保存用戶(hù)插入的值(無(wú)日期驗(yàn)證)。

如果未使用NO_ZERO_IN_DATE SQL模式,“天”和“月”部分可能為0。如果你打算將生日保存在DATE列而且僅知道部分日期,它十分方便。

如果未使用NO_ZERO_DATE SQL模式,MySQL也允許你將'0000-00-00'保存為“偽日期”。在某些情況下,它比使用NULL值更方便。

如果無(wú)法將日期轉(zhuǎn)換為任何合理值,“0”將保存在DATE列中,并被檢索為'0000-00-00'。這是兼顧速度和便利性的事宜。我們認(rèn)為,數(shù)據(jù)庫(kù)服務(wù)器的職責(zé)是檢索與你保存的日期相同的日期(即使在任何情況下,數(shù)據(jù)在邏輯上不正確也同樣)。我們認(rèn)為,對(duì)日期的檢查應(yīng)由應(yīng)用程序而不是服務(wù)器負(fù)責(zé)。
如果你希望MySQL檢查所有日期并僅接受合法日期(除非由IGNORE覆蓋),應(yīng)將sql_mode設(shè)置"NO_ZERO_IN_DATE,NO_ZERO_DATE"。
************************************
如果是獲取當(dāng)前時(shí)間的話(huà)
使用mysql自帶的函數(shù)
curdate()返回日期型數(shù)據(jù) 'YYYY-MM-DD'
now()返回日期時(shí)間型數(shù)據(jù) 'YYYY-MM-DD HH:MM:SS'

$sql="insert into xxx_table (xxx_date , xxx_datetime) values( curdate(),now() )";

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多