2009-09-30 8 views
1

Je dois obtenir une date à partir d'une base de données SQL Server (SQL Server 2000), la date est stockée en tant que telle:Comment obtenir SQL Server Date dans son format natif?

2009-09-30 00:00:00.000 

Je veux passer cette date dans une fonction ASP classique à utiliser cette date dans le Base de données ailleurs, mais quand je reçois la date, il convertit dans mon code ASP à une version dépendant de la localisation, tels que:

30/09/2009 

Je veux juste la date-est que le formatage de la date il est corriger à nouveau semble inutile, bien que si c'est le seul moyen alors bien - est-il un moyen de le traiter comme des données de chaîne de sorte qu'il s tays comme ça, de sorte qu'il peut être réinséré dans la base de données à la même date, sans avoir besoin de conversion?

Répondre

7

La date ne sont pas stockées comme « 2009-09-30 00: 00: 00.000 », il est stocké en tant que numéro 8 octets où les 4 premiers octets sont jours depuis le 1er janvier 1900 et les autres 4 octets sont millisecondes dans la date.

Pour obtenir votre format, utilisez convert (varchar, dt, 121). Pour obtenir le format brut, utilisez convert (binary (8), dt)

EDIT: Une fois que votre question a été éditée, il semble que ce que vous voulez vraiment, c'est pouvoir exécuter la date de conversion -> chaîne -> date.

Pour cela vous pouvez utiliser @s = convertir (varchar, @dt, 121); @dt = convert (datetime, @s, 121). Tous les autres formats fonctionneraient probablement aussi bien, tant qu'ils sont appliqués de manière cohérente dans les deux directions.

+0

Je savais que SQL stockait la date à sa manière, mais je ne savais pas qu'il y avait une conversion implicite dans l'Analyseur de requêtes, j'aurais dû vérifier le format réel. – RoguePlanetoid

+0

Si vous le saviez, qu'entendez-vous par format natif? – erikkallen

+0

Je pensais que c'était le format natif que je déclarais, pas le format natif - mais je cherchais une méthode pour copier les dates et la pensée en utilisant le format natif serait mieux en SQL - mais comme la date est en cours de conversion, va le convertir à la place. – RoguePlanetoid

2

Voici une liste complète des façons: http://www.sql-server-helper.com/tips/date-formats.aspx

Comme une note, le stockage est en fait deux entiers. Le premier est le nombre de jours avant ou après le 1er janvier 1900 et l'autre est le nombre de millisecondes écoulées depuis minuit.

+0

Cette dateformat liste est à portée de main, ayant toujours à traiter avec des dates d'une manière ou une autre - cela devrait être utile pour référence ultérieure. – RoguePlanetoid

0

est ici une fonction pour cette ...

'********************************************************************************************************** 
'' @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

Si vous voulez juste pour récupérer une date, puis l'utiliser dans une autre requête, il vaut mieux ne pas convertir de une chaîne du tout. De cette façon, vous n'avez pas à vous soucier des formats utilisés lors de la conversion.

Pour ce faire, vous devez utiliser des requêtes paramétrées. Vous pouvez google pour cela, mais en ASP classique avec VB, il ressemblera à quelque chose comme:

' 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

Merci pour cela, j'ai utilisé la conversion à la place, mais passer des dates entre les méthodes SQL peut être utile pour quelque chose ou quelqu'un d'autre. Utiliser le CreateParameter pour préserver le format de date est quelque chose que j'ai oublié que vous pourriez faire avec des requêtes paramétrées. – RoguePlanetoid

Questions connexes