2009-09-30 69 views
1

我需要從一個SQL Server數據庫(SQL Server 2000中)一個日期,該日期存儲爲這樣:如何獲取SQL Server日期的原生格式?

2009-09-30 00:00:00.000 

我想通過這個日期到經典ASP函數使用此日期在數據庫 別的地方,但是當我得到的日期,它在我的ASP代碼轉換爲語言環境相關的版本,如:

30/09/2009 

我只想日期,是格式化的日期,因此是再次糾正似乎是不必要的,但如果這是唯一的方式那麼罰款 - 有什麼辦法把它作爲字符串數據處理它這樣的話,所以它可以作爲相同的日期插入到數據庫中,而不需要轉換?

回答

7

日期不存儲爲'2009-09-30 00:00:00.000',它存儲爲8字節的數字,其中前4個字節是從1900年1月1日開始的幾天,其他4個字節是毫秒在日期。

要獲得您的格式,請使用convert(varchar,dt,121)。要獲得原始格式使用轉換(二進制(8),DT)

編輯:在你的問題被編輯後,看來你真正想要的是能夠執行轉換日期 - >字符串 - >日期。爲此,您可以使用@s = convert(varchar,@dt,121); @dt = convert(日期時間,@s,121)。所有其他格式都可能會起作用,只要它們在兩個方向上一致應用。

+0

我知道SQL以自己的方式存儲日期,但不知道查詢分析器中是否存在隱式轉換,應該檢查實際格式是什麼。 – RoguePlanetoid 2009-09-30 13:27:29

+0

如果你知道這一點,你是什麼意思與本機格式? – erikkallen 2009-09-30 13:51:25

+0

我認爲這是我說的原生格式,而不是實際的原生格式 - 但是我正在尋找一種方法來複制日期,並認爲使用本機格式在SQL中會更好 - 但由於日期正在轉換,無論如何,我將會轉換它。 – RoguePlanetoid 2009-09-30 14:27:48

2

這裏有辦法的完整列表:http://www.sql-server-helper.com/tips/date-formats.aspx

作爲一個說明,存儲實際上是兩個整數。第一個是1900年1月1日之前或之後的天數,另一個是午夜以來的毫秒數。

+0

這日期格式列表是很方便的,總是要應對一些這樣或那樣的日期 - 這應該是未來的參考價值。 – RoguePlanetoid 2009-09-30 13:28:09

0

下面是該函數...

'********************************************************************************************************** 
'' @SDESCRIPTION: Gets an independent sql representation for a datetime string standardised by ISO 8601 
'' @DESCRIPTION: If you want to create a sql statement containing a date query in the where clause, 
''     use this function to create a datetime object. 
''     EXAMPLE: 
''     In Sql Server: Declare @timeTable TABLE (name int, starttime datetime) 
''     In VBScript: sql = "SELECT * FROM timeTable WHERE starttime = " & date.toMsSqlDateFormat(cDate('2007-01-01 15:30:00')) 
''     Results in: SELECT * FROM timeTable WHERE starttime = cast('2006-01-01T15:30:00' as datetime) 
''     NOTE: only for MS SQL Server 
'' @PARAM:   dat [date]: the date/time you want to cast 
'' @RETURN:   [string] the formatted date string 
'********************************************************************************************************** 
public function toMsSqlDateFormat(dat) 
    if dat = empty then exit function 
    toMsSqlDateFormat = "cast('" & year(dat) & "-" & lib.custom.forceZeros(month(dat), 2) & "-" & _ 
         padLeft(day(dat), 2, "0") & "T" & padLeft(hour(dat), 2, "0") & ":" & _ 
         padLeft(minute(dat), 2, "0") & ":" & padLeft(second(dat), 2, "0") & "' as datetime)" 
end function 

'****************************************************************************************************************** 
'' @SDESCRIPTION: right-aligns a given value by padding left a given character to a totalsize 
'' @DESCRIPTION: example: input: <em>22</em> -> output: <em>00022</em> (padded to total length of 5 with the paddingchar 0) 
'' @PARAM:   value [string]: the value which should be aligned right 
'' @PARAM:   totalLength [string]: whats the total Length of the result string 
'' @PARAM:   paddingChar [string]: the char which is taken for padding 
'' @RETURN:   [string] right aligned string. 
'****************************************************************************************************************** 
public function padLeft(value, totalLength, paddingChar) 
    padLeft = right(clone(paddingChar, totalLength) & value, totalLength) 
end function 

public function clone(byVal str, n) 
    for i = 1 to n : clone = clone & str : next 
end function 
0

如果你只是想檢索日期和隨後在另一查詢中使用它,你離它不轉換爲字符串要好。這樣,您無需擔心在轉換過程中使用的格式。

爲此,您需要使用參數化查詢。您可以谷歌這一點,但在傳統的ASP與VB它看起來像:

' Retrieval 
... 
Set objCommand = CreateObject("ADODB.Command") 
... 
objCommand.CommandText = "SELECT SomeDate FROM SomeTable" 
... 
Set objRS = objCommand.Execute 
... 
dtSomeDate = objRS("SomeDate").Value ' This is a Date object 


' Write date to db 
... 
Set objCommand = CreateObject("ADODB.Command") 
... 
objCommand.CommandText = "INSERT INTO SomeTable (...,SomeDate) VALUES (...,?)" 
Set objParam = objCommand.CreateParameter("SomeDate", adDateTime, adParamInput, dtSomeDate) 
... 
objCommand.Execute 
+0

謝謝,我已經使用了轉換,但在SQL方法之間傳遞日期可能對某些事情或其他人有用。使用CreateParameter保存日期格式是我忘記了你可以用參數化查詢做的事情。 – RoguePlanetoid 2009-10-01 08:49:26