SQL嵌套选择

时间:2009-01-29 19:46:27

标签: sql select

我正在尝试构造一个执行以下操作的sql select语句:

SELECT GetDate() Mon, GetDate() Tues

但我也希望能够对每一列(Mon,Tues)设置WHERE限制。所以我想要这样的东西,但这不正确:

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

请指出正确的方向,谢谢。

5 个答案:

答案 0 :(得分:2)

使用列名:

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

答案 1 :(得分:2)

GetDate()只检索当前日期/时间。

因此,所有原始查询(以及目前为止的大多数“答案”)都会检索当前日期和时间两次,然后在其上放置“Mon”和“Tue”列标签。

这真的是你想要的吗?

答案 2 :(得分:1)

您是否想要CASE声明?

或者你是想尝试最近的星期一/周二/周三/等?

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这是一个以日期时间和星期几作为输入的函数。它会返回一周中某一天的最新日期。

它假定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]