¿Cómo se actualiza un campo DateTime en T-SQL?

81

La siguiente consulta no actualiza el campo de fecha y hora:

update table
SET EndDate = '2009-05-25'
WHERE Id = 1

También lo probé sin guiones, pero tampoco funciona.

Xaisoft
fuente
1
¿Es la fecha el nombre real de la columna?
Gratzy
1
en realidad no, es EndDate, pero lo acorté a Date.
Xaisoft
¿Obtiene un error o simplemente no obtiene resultados?
Gratzy
¿Cuál es el tipo de datos de la EndDatecolumna?
OMG Ponies
Dice 1 fila afectada, pero cuando reviso, la fecha no ha cambiado.
Xaisoft

Respuestas:

33

Normalmente, debería funcionar.

¿Pero puedes probar esto? No tengo SQL en la PC de mi casa, no puedo intentarlo yo mismo

UPDATE table
SET EndDate = '2009-05-25 00:00:00.000'
WHERE Id = 1
Serkan Hekimoglu
fuente
1
Esto funcionó, pero lo intenté antes sin todos los ceros y no funcionó. ¿Por qué?
Xaisoft
Probé con '2009-05-25 00: 02: 01.000', pero no funcionó.
Xaisoft
Bien, en serio, no tengo ni idea. Porque escribió sin información de tiempo, y SQL debe adjuntar automáticamente 00: 00: 00.000 por defecto. Por eso hay que trabajarlo.
Serkan Hekimoglu
11

La cadena literal se pega de acuerdo con la configuración de formato de fecha actual, consulte SET DATEFORMAT. Un formato que siempre funcionará es el '20090525'.

Ahora, por supuesto, debe definir "no funciona". ¿No se actualizan los registros? Quizás Id=1no coincida con ningún récord ...

Si dice 'Un registro cambiado', entonces tal vez necesite mostrarnos cómo verifica ...

Remus Rusanu
fuente
El formato de fecha es la razón por la que estaba pensando que ser explícito sobre la conversión sería una buena idea ...
OMG Ponies
Buenas cosas Remus, SET DATEFORMATes realmente efectivo al escribir SQL para entornos con diferentes localizaciones
Matt R
¡Increíble! Esto funcionó para mí y me ahorró algunos pasos porque el campo que estoy convirtiendo ya estaba usando este formato, es decir, no es necesario convertirlo a ISO u otro formato primero.
Roberto
8

Usar un parámetro DateTime es la mejor manera. Sin embargo, si aún desea pasar un DateTime como una cadena, entonces el CAST no debería ser necesario siempre que se utilice un formato independiente del idioma.

p.ej

Dada una tabla creada como:

create table t1 (id int, EndDate DATETIME)
insert t1 (id, EndDate) values (1, GETDATE())

Lo siguiente siempre debería funcionar:

update t1 set EndDate = '20100525' where id = 1 -- YYYYMMDD is language agnostic

Lo siguiente funcionará:

SET LANGUAGE us_english
update t1 set EndDate = '2010-05-25' where id = 1

Sin embargo, esto no:

SET LANGUAGE british
update t1 set EndDate = '2010-05-25' where id = 1  

Esto se debe a que 'YYYY-MM-DD' no es un formato independiente del idioma (desde el punto de vista del servidor SQL).

El formato ISO 'AAAA-MM-DDThh: mm: ss' también es independiente del idioma y es útil cuando necesita pasar un tiempo distinto de cero.

Más información: http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes

Moe Sisko
fuente
5
UPDATE TABLE
   SET EndDate = CAST('2017-12-31' AS DATE)
 WHERE Id = '123'
Evgeny Sobolev
fuente
2

Eso debería funcionar, pondría corchetes alrededor de [Fecha] ya que es una palabra clave reservada.

mikesl
fuente
2

Si no está interesado en especificar una hora, también puede usar el formato ' DD / MM / YYYY ', sin embargo, me quedaría con un método de conversión y su formato ISO relevante, ya que realmente debería evitar usar valores predeterminados.

He aquí un ejemplo:

SET startDate = CONVERT(datetime,'2015-03-11T23:59:59.000',126) WHERE custID = 'F24'

OriginalOcto
fuente
1

¿Hay tal vez un gatillo en la mesa que lo hace retroceder?

Gratzy
fuente
Lo comprobaré dos veces.
Xaisoft