2009-01-29 9 views
0

Je suis en train de construire une instruction select SQL qui effectue les opérations suivantes:SQL Select Nested

SELECT GetDate() Mon, GetDate() Tues 

Mais je veux aussi être en mesure de mettre où des restrictions sur chaque colonne (du lundi, mardi). Donc, je veux quelque chose comme ça, mais ce n'est pas correct:

SELECT (GetDate() Mon WHERE (1=1)), (GetDate() TuesWHERE (1=1)) 

S'il vous plaît pointez-moi dans la bonne direction, merci.

+0

Pouvez-vous préciser le type de résultats que vous cherchez à obtenir? – Seibar

+0

Je ne comprends pas ce que vous essayez d'accomplir ici. –

+0

Oliver S: Votre question n'a aucun sens, car l'exemple de requête ne retourne rien d'utile. Décrivez ce que vous essayez vraiment de faire et les gens peuvent vous donner des réponses plus pertinentes. –

Répondre

0
SELECT (select GetDate() Mon WHERE (1=1)), (select GetDate() Tues WHERE (1=1)) 
+0

comment se fait-il que les noms des colonnes n'apparaissent pas maintenant? –

+0

SELECT (sélectionnez GetDate() WHERE (1 = 1)) Mon, (sélectionnez GetDate() WHERE (1 = 1)) mardi –

2

Avec les noms de colonnes:

select 
    (select getDate() where (1=1)) Mon, 
    (select getDate() where (2=2)) Tues 
+0

Je vais sortir sur un membre et deviner que la fonction GETDATE et WHERE 1 = 1 ne sont que des exemples, et qu'en réalité sa requête est beaucoup plus complexe. Dans ce cas, la réponse de Terrapin est probablement ce qu'il cherche, pour maintenir les noms des colonnes. Remplacez simplement les fonctions réelles et les clauses where. – BradC

1

Voulez-vous peut-être une déclaration CASE? Ou essayez-vous d'obtenir le dernier lundi/mardi/mercredi/etc? GetDate() vient de récupérer la date et l'heure actuelle.

2

Donc toute votre requête d'origine (et la plupart des "réponses" jusqu'à présent) est de récupérer la date et l'heure actuelles deux fois, puis de mettre une étiquette de colonne "Mon" et "Mar" dessus.

Est-ce vraiment ce que vous voulez?

0

Voici une fonction qui prend une date et un jour de la semaine en entrée. Il renvoie la date la plus récente avec ce jour de la semaine.

Il suppose un DATEFIRST de 7 (Fait dimanche 1er jour).

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[udf_getDateFromDayName]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) 
DROP FUNCTION [dbo].[udf_getDateFromDayName] 
GO 

--Set Sunday to be day one 
SET DATEFIRST 7 
GO 

CREATE FUNCTION [dbo].[udf_getDateFromDayName] 
(
    @dtsMaxDate DATETIME, 
    @sDayName VARCHAR(8) 
) 
RETURNS DATETIME 
AS 
BEGIN 

    DECLARE @iDayNumber INT, @dtsTemp DATETIME 

    SET @sDayName = LEFT(UPPER(@sDayName),3) 

    SET @iDayNumber = 
     (CASE 
      WHEN @sDayName = 'SUN' THEN 1 
      WHEN @sDayName = 'MON' THEN 2 
      WHEN @sDayName = 'TUE' THEN 3 
      WHEN @sDayName = 'WED' THEN 4 
      WHEN @sDayName = 'THU' THEN 5 
      WHEN @sDayName = 'FRI' THEN 6 
      WHEN @sDayName = 'SAT' THEN 7 
      ELSE 0 --Invalid day 
      END 
     ) 

    IF @iDayNumber = 0 RETURN NULL 

    SET @dtsTemp = CAST(FLOOR(CAST(@dtsMaxDate AS FLOAT)) AS DATETIME) 

    WHILE DATEPART(DW,@dtsTemp) <> @iDayNumber 
     SET @dtsTemp = DATEADD (dd, -1, @dtsTemp) 

     RETURN @dtsTemp 
END 

GO 

Une fois que vous avez la fonction, votre requête est simple.

Vous pouvez faire quelque chose comme ceci:

Ou idéalement, mettre la date max dans une première variable:

DECLARE @dtsNow DATETIME 
SET @dtsNow = GETDATE() 
SELECT dbo.udf_getDateFromDayName(@dtsNow,'mon') [Mon], 
     dbo.udf_getDateFromDayName(@dtsNow,'tue') [Tue], 
     dbo.udf_getDateFromDayName(@dtsNow,'wed') [Wed], 
     dbo.udf_getDateFromDayName(@dtsNow,'thu') [Thu], 
     dbo.udf_getDateFromDayName(@dtsNow,'fri') [Fri], 
     dbo.udf_getDateFromDayName(@dtsNow,'sat') [Sat], 
     dbo.udf_getDateFromDayName(@dtsNow,'sun') [Sun]