如何以其本机格式获取SQL Server Date?

时间:2009-09-30 12:40:33

标签: sql sql-server date asp-classic sql-server-2000

我需要从SQL Server数据库(SQL Server 2000)获取日期,日期存储如下:

2009-09-30 00:00:00.000

我想将此日期传递给Classic ASP函数,以便在数据库中使用此日期 在其他地方,但是当我得到日期时,它会将我的ASP代码转换为依赖于语言环境的版本,例如:

30/09/2009

我只是希望日期原样格式化日期,所以它再次正确似乎是不必要的,虽然如果这是唯一的方法那么好 - 是否有任何方法将其视为字符串数据所以它保持这样,所以它可以在同一日期插回数据库,无需转换吗?

4 个答案:

答案 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