我需要从SQL Server数据库(SQL Server 2000)获取日期,日期存储如下:
2009-09-30 00:00:00.000
我想将此日期传递给Classic ASP函数,以便在数据库中使用此日期 在其他地方,但是当我得到日期时,它会将我的ASP代码转换为依赖于语言环境的版本,例如:
30/09/2009
我只是希望日期原样格式化日期,所以它再次正确似乎是不必要的,虽然如果这是唯一的方法那么好 - 是否有任何方法将其视为字符串数据所以它保持这样,所以它可以在同一日期插回数据库,无需转换吗?
答案 0 :(得分:7)
日期不存储为'2009-09-30 00:00:00.000',它存储为8字节数字,其中前4个字节是自1900年1月1日以来的天数,其他4个字节是毫秒约会。
要获取您的格式,请使用convert(varchar,dt,121)。要获取原始格式,请使用convert(binary(8),dt)
编辑:编辑完问题后,您真正想要的是能够执行转换日期 - > string - >日期。
为此你可以使用@s = convert(varchar,@ dt,121); @dt = convert(datetime,@ s,121)。所有其他格式也可能都有效,只要它们始终在两个方向上应用。
答案 1 :(得分:2)
以下是完整的方式列表:http://www.sql-server-helper.com/tips/date-formats.aspx
作为注释,存储实际上是两个整数。第一个是1900年1月1日之前或之后的天数,另一个是自午夜以来的毫秒数。
答案 2 :(得分: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
答案 3 :(得分:0)
如果您只想检索日期并随后在另一个查询中使用它,那么最好不要将其转换为字符串。这样,您无需担心转换过程中使用的格式。
为此,您需要使用参数化查询。你可以谷歌这个,但在使用VB的经典ASP中,它看起来像:
' 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