Pages

2007年12月31日 星期一

SQL 日期 Convert 函數

好吧... 我承認這篇或許很無聊,不過對於一些 SQL 苦手/新手 在對於一些日期轉換的上面上應該多少有些些小幫助。

--------------------------------------------------------------------
Transact-SQL Server日期函數 CONVERT 範例

在 Transact-SQL 的預設日期 DATETIME 格式是 yyyy-mm-dd hh:mm:ss.mmm

例如:

SELECT GETDATE()
=> 2007-12-31 10:30:20.517

而在程式中常常需要日期的處理,尤其是什麼只要日期不要時間啊,只要時間不要日期啊,或是日期的 Format 等等,為了省掉在程式上撰寫轉換函數,這裡有些些 Transact-SQL 常用到的日期時間格式轉換,方法如下:

SELECT CONVERT(VARCHAR(18) , getdate(), 100)
=> 12 31 2007 10:30AM

SELECT CONVERT(VARCHAR(10) , GETDATE(), 101 )
=> 12/31/2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 102 )
=> 2007.12.31

SELECT CONVERT(VARCHAR(10) , GETDATE(), 103 )
=> 31/12/2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 104 )
=> 31.12.2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 105 )
=> 31-12-2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 106 )
=> 31 12 2007

SELECT CONVERT(VARCHAR(11) , GETDATE(), 107 )
=> 12 31, 2007

SELECT CONVERT(VARCHAR(8) , GETDATE(), 108 )
=> 10:30:20

SELECT CONVERT(VARCHAR(25) , GETDATE(), 109)
=> 12 31 2007 10:30:20:517AM

SELECT CONVERT(VARCHAR(10) , GETDATE(), 110 )
=> 12-31-2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 111 )
=> 2007/12/31

SELECT CONVERT(VARCHAR(8) , GETDATE(), 112 )
=> 20071231

SELECT CONVERT(VARCHAR(23) , GETDATE(), 113 )
=> 31 12 2007 10:30:20:517

SELECT CONVERT(VARCHAR(12) , GETDATE(), 114 )
=> 10:30:20:517

SELECT CONVERT(VARCHAR, GETDATE(), 120 )
=> 2007-12-31 10:30:20

最後
SELECT REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120 ),'-',''),' ',''),':','')
=> 20071231103020

這些全部已在 Transact-SQL 上測試過了
--------------------------------------------------------------

好吧,我承認,以上真的很無聊,很無聊

30 回應:

匿名 提到...

最後一個語法很少見耶
應該沒有人會故意把日期/時間全弄成一串的吧

Unknown 提到...

呵呵..

因為有人曾問我流水號的寫法啊.. 這是一個方法 (取日期那一段)

或是要產生一個簡單的不重複的值,這是一個很快且簡易的寫法

匿名 提到...

謝謝板大,我收下了

匿名 提到...

在同一秒不query兩次的前提下
的確是個產生不重複值的好方法

國良先生 提到...

>>簡單不重複的值,很快且簡易的寫法
不受時間限制,也可以用 NEWID()

select newid()

新年快樂!

Unknown 提到...

國良先生

沒錯,NEWID 可以產生出不重複的唯一值,謝謝指教囉。

NEWID 用在不需要顯示的 SYSTEM ID 上還蠻方便的。

新年快樂 !

Unknown 提到...

yuanpai,

妳說的也沒錯啦,前提是在一秒不 query 兩次的前提下。不過為了避免這個情況發生,可以把要因提升到千分之一秒來降低發生錯誤的機會。

Chia 提到...

這是用在哪裡的密碼?(外行人的問題lol..)

Unknown 提到...

dear您好:
於網路搜尋找到您的space...
想請教您關於轉換日期的問題...
如果在我的資料庫...即有的欄位【transdate】...
其日期的格式是「20080402」...
如果我想要把他轉成『2008/04/02』...
是否有辦法可以...
因為運用您剛剛的方法...不行耶...
可麻煩您若不忙...可以我一下...
我的mail是:[ apple1588@hotmail.com ]...
謝謝您

Unknown 提到...

Peggy,

你得要先確認一下你的欄位格式是 DateTime 嗎 ?

如果是 varchar 之類的那就只能用程式去處理了。

國良先生 提到...

Hi Skyer & Peggy

CONVERT(DATETIME,'20080402')
就能將字串'20080402'變成日期

所以 SELECT CONVERT(VARCHAR(10), CONVERT(DATETIME, '20080402'), 111) 就能將字串'20080402'變成字串'2008/04/02'

在SQL Server 2000,2005 都試過OK。

Unknown 提到...

啊哈...

對喔,我都忘了也可以直接在 SQL 裡先把 字串先轉成日期,這樣就精簡多了 !

謝謝國良先生啦

匿名 提到...

那請問一下 我現在DateTime的格式為 2008/09/12 下午01:08:08 這樣子,可是我想要的格式是"月/日 時" EX: 09/12 13這樣的格式要怎麼用呢?

Unknown 提到...

SELECT REPLACE(RIGHT(LEFT(CONVERT(VARCHAR(20) , GETDATE(), 120 ),13),8),'-','/')

就好啦

匿名 提到...

請問一下我現在的資料庫日期欄位為smalldatetime,他所顯現的內容為2008/11/1 上午 12:00:00,我也嘗試著用這個語法寫SELECT CONVERT(VARCHAR(10) , GETDATE(), 111 ),雖然可以顯示為我要的日期形式2008/11/1,但他出現的是今天的日期而不是我資料庫的內容哩...請問大大要如何寫呢?

匿名 提到...

請問一下我現在資料庫有一欄位為smalldatetime 類型內容為2008/12/31,但我現在要下查詢指令WHERE 可是他只能讓我查2008/12/31,可是我要查的是20081231這樣,請問指令該如何下呢?

Unknown 提到...

To Chian,

因為妳是用 GETDATE() 這個函數啊, 這個函數會得到目前的時間日期,妳只要把它換成妳資料庫裡的名稱就好了,譬如說

SELECT CONVERT(VARCHAR(10) , Mydate, 111 )

Unknown 提到...

To Lucy,

如果是我的話,我會在程式裡處理這件事,而不會在 SQL 裡在 Where 的地方使用 20081231。

意思就是在程式處理之後把 Where 裡的條件變成 2008/12/31,我個人的習慣還是 SQL 越簡單越好。

Sherry 提到...

版大你好,我是Microsoft SQL 2005的新手,現在卡在想將DATETIME格式改成只有年月日的格式,所以看到您的文章簡直就像看到了救星...可是...我都是用最簡單的"新增資料表"來打入我要的欄位名稱跟屬性,完全不會將您的語法寫入我的屬性中...可以請教我在"資料行屬性"裡頭要如何做修正呢?謝謝您!

Unknown 提到...

Dear Sherry,

Datetime 格式所保留的資料就是時間的資料。而以上所討論的,都是主要在於取出資料時的格式化,以便閱讀上的方便。

而所說的那些語法,也都是在下 SQL 指令取資料的時候用到的,跟所輸入的東西沒有關係。

不知道妳的意思是不是這樣?

Sherry 提到...

恩...應該是說....我現在在嘗試著寫訂單資料表...我希望我在輸入資料打上日期時,他只會秀出2009/3/2而不是 2009/3/2 12:00

麻煩您幫我解惑了!

Unknown 提到...

Dear Sherry,

如果沒有會錯妳的意思,這應該不是很難。妳輸入日期後,妳可以不管資料庫內變成何種格式,只要在取出的時後寫成
SELECT CONVERT(VARCHAR(10) , 資料欄名稱, 111)
這樣顯示出來的日期就會是你要的格式了。

Sherry 提到...

原來如此...那我就等我轉去ACCESS給使用者使用的時候再做轉換試試看好了,謝謝版大..不過再好奇問一下..假設我現在完全沒有SQL的基礎想要買書回來寫一般公司用的進銷存系統,請問您會推薦哪一本嗎?謝謝囉!

Jni C 提到...

謝謝你的提供^^

匿名 提到...

大大您好,寫這篇日期Convert或許對您來說很無聊,但對我們這些初學者來說真的很有用,可以減少自己摸索的時間,真的謝啦,希望您無聊的時候可以再寫些無聊的文章^_^

大和號 提到...

S大加油!

匿名 提到...

很感謝你提供這些方法!很有用呢!

喵~ 提到...

對於我來說,確實有幫助,很明確表達,後面那個參數所造成的變化。感恩

維修中的兔子精 提到...

感謝~~有幫助到

sheau 提到...

Sourcemy blog newsadditional resources click sitepop over to these guys