2012-06-03 16 views
8

No puedo obtener todas las filas creadas hoy. He usado múltiples funciones como getdate(), Cast, Convert, etc. pero todo fue en vano.Obtener todas las filas creadas hoy

Ésta es mi consulta básica:

SELECT timeId 
FROM table_roaster_time_table 
WHERE (user_id = @user_id) AND (DATEDIFF(d, date, GETDATE()) = 0) 

Quiero conseguir el timeId de la mesa table_roaster_time_table, donde se ofrecerá userid y la fecha es hoy en día.

¿Cómo puedo hacer esto?

+0

es inútil. He intentado las dos respuestas de urs. pero el tipo de datos que he configurado para la fecha es datetime. otra cosa es que no puedo usar el valor estático como '6/01/2012' porque quiero establecer el horario de tostadores diariamente y para esto quiero la fecha actual diaria. también he usado DÍA (fecha) = Día (getdate() pero tampoco funciona, y recupero el valor nulo para timeid, pero ya tengo 2 registros en ella 1 tengo 3/6/2012 y el otro tiene 2/6/2012 fecha y registros – iConfused

+3

¿Está seguro de que "3/6/2012" es el 3 de junio y no el 6 de marzo? –

+1

También debe evitar el uso de palabras reservadas (y muy vagas) como 'fecha' como nombres de columna.' Created_date' es más largo pero evita una palabra clave reservada y describe mejor los datos en esa columna. –

Respuesta

22

Para mantener alguna posibilidad de utilizar un índice en la columna de la [date] (incluso si uno no existe hoy en día, es posible que en el futuro), trate de:

AND [date] >= DATEADD(DAY, 0, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP)) 
AND [date] < DATEADD(DAY, 1, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP)); 

Si está utilizando SQL Server 2008 o mejor, se puede hacer algo como esto para acortar el código pero todavía hacer uso de un índice en [date] si existe:

AND CONVERT(DATE, [date]) = CONVERT(DATE, CURRENT_TIMESTAMP); 

EDITAR

Ya que parece ser confundido por qué 3/6/2012 es el 6 de marzo y no el 3 de junio También podría sugerir que en lugar de insertar manualmente literales de fecha ambiguas como '3/6/2012' en la base de datos, a tomar la columna de un incumplimiento, tales como:

ALTER TABLE dbo.table_roaster_time_table 
    ALTER COLUMN [date] DATETIME NOT NULL; 

ALTER TABLE dbo.table_roaster_time_table 
    ADD CONSTRAINT df_date DEFAULT (CURRENT_TIMESTAMP) 
    FOR [date]; 

Si va a insertar literales de fecha entonces por lo menos utilizar un formato seguro y sin ambigüedades, como YYYYMMDD:

INSERT dbo.table_roaster_time_table([date]) VALUES('20120603'); 

Ahora no hay confusión.

+0

1 me gusta usar CONVERT (FECHA, x) para truncar la parte de tiempo, sin embargo. – usr

+0

@usr no sé que el PO puede usar 'DATE' ya que no se especificó ninguna versión de SQL Server. En caso de duda siempre trato de recordar usar lowes t denominador común (esto funcionará en 2000 y 2005 hasta el 2012). –

+0

@AaronBertrand +1. Fuera de interés, ¿hay alguna ventaja de usar 'CURRENT_TIMESTAMP' sobre' GetDate() '? – Bridge

Cuestiones relacionadas