2008-10-22 5 views
10

Estoy planeando una aplicación PHP que necesita almacenar fecha/hora en una base de datos MSSQL. (Para los curiosos, es una aplicación de calendario.) ¿Cuál es el formato preferido para almacenar esta información?¿Cuál es el formato preferido para almacenar fechas/horas en una base de datos de SQL Server cuando PHP es su idioma principal?

MSSQL tiene su propio tipo de datos datetime, que funciona bien en la base de datos y es muy legible. Sin embargo, no hay ninguna función MSSQL para traducir los valores de fecha y hora al formato preferido de PHP: indicación de fecha y hora de UNIX. Esto hace que sea un poco más doloroso de usar con PHP. La marca de tiempo de UNIX es atractiva porque eso es lo que le gusta a PHP, pero ciertamente no es tan legible y no hay muchas funciones integradas de MSSQL para trabajar con los datos.

¿Almacenaría esta información como tipo de datos datetime, como marcas de tiempo UNIX (como int, bigint o varchar datatype), como ambos formatos uno al lado del otro, o como algo completamente distinto?

+0

PHP 5.2.0 lanzado el 2 de noviembre de 2006 (dos años antes de esta pregunta) introdujo la clase DateTime. Esto (y sus clases y derivados relacionados) es ahora cómo debería manipular las fechas y horas en PHP. Considere si su cumpleaños es antes de 1970. ¿Cómo puede almacenar eso como una marca de tiempo Unix? También debe saber que este número entero no es un número entero regular, sino que representa una marca de tiempo Unix. Usa una clase que diga lo que es. –

Respuesta

12

Almacenaba las fechas en el formato MS-SQL para ayudar a utilizar al máximo las funciones de manipulación de fechas en T-SQL. Es más fácil escribir y leer

SELECT * FROM Foo 
WHERE DateDiff(d,field1,now()) < 1 

que tratar de realizar la operación asimilable de los números enteros que manipulan

Para convertir una fecha MsSQL en una marca de tiempo Unix uso DATEDIFF:

SELECT DATEDIFF(s,'1970-01-01 00:00:00',fieldName) as fieldNameTS 
FROM TableName 
WHERE fieldName between '10/1/2008' and '10/31/2008' 

para convertir una Unix Timestamp en una fecha MsSQL, puede hacerlo en PHP:

$msSQLDate = date("Y-m-d H:i:s", $unixDate); 

o en MsSQL

INSERT INTO TableName ( 
    fieldName 
) VALUES (
    DATEADD(s,'1970-01-01 00:00:00', ?) 
) 

Donde parámetro uno es int ($ unixDate)

4

Recomendaría lo mismo que yo para todas las fechas en cualquier motor de db, el tipo nativo db. (DATETIME)

sólo tiene que utilizar "AAAA-MM-DD HH: MM: SS" para insertar en php: date('Y-m-d H:i:s', $myTimeStampInSeconds);

-edit en respuesta a los comentarios a continuación aquí -

  1. para las columnas seleccionadas se puede utilizar $timestamp = strtotime ($yourColumnValue);
  2. i recomendamos almacenarlos en la databas formato nativo debido a continuación, puede utilizar SQL para comparar los registros utilizando las funciones de fecha/hora de SQL como DATEADD(), etc.
+0

Insertar es fácil, es usar los datos después de seleccionarlo que es más una molestia. –

+0

Además, le recomendamos que lo almacene de esta manera, pero ¿puede ampliar el motivo por el que lo recomienda? –

+0

Joe Lencioni Es más rápido porque son solo números, las comparaciones son numéricas, y no hay forma de que una fecha posterior tenga un valor menor que el anterior. Está estandarizado (ISO8601) y no es complicado llevar ningún tipo de fecha a este formato de cadena (y su conversión a entero). Mientras esté en el tipo de fecha, el programa funciona para convertir y hacer comparaciones – manhattan

2

Hola y buen día para todos

Sí, podría ser que esa es la mejor manera, fechas de tiendas en dB, lo harán tome formato db y puede dar formato cuando se necesita a medida que wich

Pero hay otra solución en el formato de fecha internacional ISO-desarrollado, me refiero a la norma ISO 8601.

El formato internacional definido por ISO (ISO 8601) intenta resolver todos los problemas de fecha definiendo un sistema de fecha numérico de la siguiente manera: AAAA-MM-DD donde

YYYY es el año [todos los dígitos, es decir2100] MM es el mes [01 (enero) a 12 (diciembre)] DD es el día [01 a 31] en función de las polillas: P

El uso de fechas numéricas no tienen también algunas de las dificultades con respecto a la legibilidad y la usabilidad no es perfecta. Sin embargo, el formato de fecha ISO es, sin embargo, la mejor opción para una representación de fecha que sea comprensible universalmente (y con precisión).

Tenga en cuenta que este formato también se puede utilizar para representar momento preciso, la información de zona horaria

Aquí está una información detallada sobre la norma ISO 8601: 2000

http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/date_and_time_format.htm

Sin más .. .. Adiós

+0

Lo que no me gusta de los formatos de fecha ISO-8601 es la "T" entre la parte de fecha y la parte de hora. Pero lo bueno es que las fechas en este formato se clasifican bien como cadenas simples. – bart

Cuestiones relacionadas