2009-01-29 137 views
0

我试图构建一个SQL SELECT语句执行以下操作:SQL嵌套查询

SELECT GetDate() Mon, GetDate() Tues 

但我也希望能够把WHERE每一列(周一,周二)的限制。所以我想要这样的东西,但它是不正确的:

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

请指点我在正确的方向,谢谢。

+0

你可以指定你希望得到的结果的类型? – Seibar 2009-01-29 19:55:46

+0

我不明白你想在这里完成什么。 – 2009-01-29 19:57:43

+0

Oliver S:您的问题没有意义,因为示例查询不会返回任何有用的信息。描述你真正想要做什么,人们可能会给你更多相关的答案。 – 2009-01-29 20:23:57

回答

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

列名:

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

你也许想CASE声明?

或者你是否试图得到最近的星期一/星期二/星期三/等?

2

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

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

这真的是你想要的吗?

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 

一旦你有了这个功能,你的查询很简单。

你可以做这样的事情:

或者理想,把最大日期变量第一:

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]