Вложенный выбор SQL - PullRequest
       8

Вложенный выбор SQL

0 голосов
/ 29 января 2009

Я пытаюсь создать оператор выбора SQL, который делает следующее:

SELECT GetDate() Mon, GetDate() Tues

Но я также хочу иметь возможность устанавливать ГДЕ ограничения для каждого столбца (понедельник, вторник). Поэтому я хочу что-то вроде этого, но это не правильно:

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

Пожалуйста, укажите мне правильное направление, спасибо.

Ответы [ 5 ]

2 голосов
/ 29 января 2009

GetDate () просто извлекает текущую дату / время.

Таким образом, весь ваш исходный запрос (и большая часть пока «ответов») делает, извлекает текущую дату и время дважды, затем помещает метки столбца «Mon» и «Tue».

Это действительно то, что вы хотите?

2 голосов
/ 29 января 2009

С именами столбцов:

select
    (select getDate() where (1=1)) Mon,
    (select getDate() where (2=2)) Tues
1 голос
/ 29 января 2009

Возможно, вы хотите CASE заявление?

Или вы пытаетесь получить самый последний понедельник / вторник / среду / и т. Д.?

0 голосов
/ 30 января 2009

Вот функция, которая принимает дату и время недели в качестве входных данных. Возвращает самую последнюю дату с этим днем ​​недели.

Предполагается, что DATEFIRST из 7 (в воскресенье 1-й день).

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

Если у вас есть функция, ваш запрос прост.

Вы можете сделать что-то вроде этого:

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

Или, в идеале, сначала указывайте максимальную дату в переменной:

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]
0 голосов
/ 29 января 2009
SELECT (select GetDate() Mon WHERE (1=1)), (select GetDate() Tues WHERE (1=1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...