2010-11-30 20 views
7

Tengo una tabla que tiene, entre otros, una columna de fecha servdate.Fecha de formato como día de la semana

que utilizar la siguiente consulta para conseguirme todos los puestos de trabajo dentro de la última semana (una semana se inicia desde el lunes):

SELECT * FROM tb1 WHERE servdate BETWEEN date('now', 'Weekday 1', '-21 days') AND date('now') 

Quiero que la consulta funciona exactamente de la misma pero en lugar de devolver los servdate campos como su correspondiente día de la semana. Por ejemplo, "lunes", en lugar de "2010-11-28".

¿Esto es posible?

+1

La idea de wallyk es bonita, pero por simplicidad preferiría "sol" "mon" en lugar de "0" "1" – brux

Respuesta

18

Puede utilizar una tabla auxiliar como se sugirió wallyk; o puede utilizar una expresión case:

select _id, busnum, 
    case cast (strftime('%w', servdate) as integer) 
    when 0 then 'Sunday' 
    when 1 then 'Monday' 
    when 2 then 'Tuesday' 
    when 3 then 'Wednesday' 
    when 4 then 'Thursday' 
    when 5 then 'Friday' 
    else 'Saturday' end as servdayofweek 
from tb1 
where ... 
+0

Bonito apéndice. No pude encontrar 'case' en la documentación, pero lo intenté en Firefox y funciona bien:' SELECT visit_date, case cast (strftime ('% w', visit_date/1000000) como entero) cuando 0 entonces 'sol' cuando 1 entonces 'mon' cuando 2 entonces 'tue' cuando 3 luego 'wed' cuando 4 entonces 'thu' cuando 5 entonces 'fri' cuando 6 entonces 'sat' else '???' finalizar como visitdayofweek FROM moz_historyvisits LÍMITE 50' – wallyk

+0

gracias esto funciona – brux

+1

La expresión de casos está documentada en http://www.sqlite.org/lang_expr.html –

-1
SELECT _id, busnum, date_format(servdate, '%a') as servdayofweek 
FROM tb1 
WHERE servdate BETWEEN date('now', 'Weekday 1', '-21 days') AND date('now') 

El% a es el día abreviado de la semana. Consulte el documentation para conocer otras formas de formatear.


edición:

Ups! Pasó por alto la etiqueta sqlite. Lo anterior es para MySQL. Para SQLite (documentation):

SELECT _id, busnum, strftime('%w', servdate) as servdayofweek 
FROM tb1 
WHERE servdate BETWEEN date('now', 'Weekday 1', '-21 days') AND date('now') 

excepto Esto devuelve el día de la semana como un valor de 0 a 6. Tal vez eso es lo suficientemente bueno?

+1

hola, ejecuté la consulta y obtuve: error SQL: no funciona : date_format – brux

+0

¿podría este código ser adaptado para devolver "mon" en lugar de "1", etc.? : D – brux

+0

Hasta ahora, no he encontrado una manera directa de hacerlo. Si puede agregar otra tabla, entonces es trivial. – wallyk

0

Aquí una sugerencia que implica escribir menos que el bloque CASE ... WHEN. A continuación, se hace lo mismo por extracción subcadena:

select substr('SunMonTueWedThuFriSat', 1 + 3*strftime('%w', timestr), 3) as dow 
from ... 

Produce sólo abreviaturas de longitud fija en lugar de los nombres completos de lunes a viernes, sin embargo. (Pero a veces eso es suficiente.)

Cuestiones relacionadas