2011-07-28 4 views
-1

je tente d'interroger ma table qui a le schéma:valeur requête basée sur le temps de la journée

CREATE TABLE [dbo].[FIN_MeetingDisplay-DefaultConfig](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [name] [varchar](150) NOT NULL, 
    [value] [nvarchar](max) NOT NULL 
) 

Deux valeurs dans le magasin de table un moment où l'économie d'énergie doit être activé ou désactivé:

EnablePowerSave 22h00
DisablePowerSave 08:00

Ce que je voulais faire est d'interroger la table pour voir si t L'heure actuelle se situe entre la fenêtre EnablePowerSave et la fenêtre DisablePowerSave.

Je l'interroge actuellement avec ce qui suit, ce qui revient toujours faux parce qu'il utilise la date d'aujourd'hui. Quel serait le meilleur moyen de changer la requête de sorte que s'il est après 8h pour utiliser la date de demain et avant 8h pour utiliser la date du jour?

SELECT CONVERT(DATETIME, CAST(GETDATE() AS VARCHAR(11)) + ' ' + VALUE, 103) 
FROM dbo.[FIN_MeetingDisplay-DefaultConfig] 
WHERE name = 'EnablePowerSave' 

Merci,

Matt

Répondre

0

Cela implique une certaine connaissance supposée - que l'option Activer le temps est le premier jour et l'heure Désactiver est toujours le lendemain, et vous êtes toujours en cours d'exécution de la requête sur les points suivants journée.

DECLARE @t SMALLDATETIME; 
SET @t = CURRENT_TIMESTAMP; 

;WITH x(n,t) AS 
(
    SELECT name = LEFT(name, 1), 
    DATEADD(DAY, CASE WHEN LEFT(name, 1) = 'E' THEN -1 ELSE 0 END, 
    CONVERT(SMALLDATETIME, CONVERT(CHAR(8), CURRENT_TIMESTAMP, 112) 
    + ' ' + value)) 
    FROM dbo.[FIN_MeetingDisplay-DefaultConfig] 
    WHERE name IN ('EnablePowerSave', 'DisablePowerSave') 
) 
SELECT 
    [start] = x.t, 
    [end]  = y.t, 
    [current] = @t, 
    [status] = CASE 
    WHEN @t BETWEEN x.t AND y.t 
     THEN 'between' 
     ELSE 'not between' 
    END 
FROM x 
CROSS JOIN x AS y 
WHERE x.n = 'E' 
AND y.n = 'D'; 
Questions connexes