2013-12-13 2 views
0

Мне нужно ссылаться на столбцы с псевдонимом в sqlserver. здесь «д.р.» является дата рождения столбца из таблицы tbl_Student_AdmissionСсылка на псевдонима столбца в Sql

Select DATEPART(yy, dob) as years 
From dbo.tbl_Student_Admission 
Where years between '1990' and '1992' 
+1

'между '1990' и «1992'' !!! ... они струны ?! конечно, это должно быть «между 1990 и 1992 годами» – whytheq

ответ

3

Просто использовать второй SELECT:

select * from (
    select DATEPART(yy, dob) as years from dbo.tbl_Student_Admission 
) v1 
where years between '1990' and '1992' 

Пожалуйста, обратите внимание, что с помощью строки для вашего BETWEEN, вы вынудив чтобы преобразовать результаты DATEPART в строку, что обычно приводит к снижению производительности. Таким образом, вы должны использовать простые числа вместо:

select * from (
    select DATEPART(yy, dob) as years from dbo.tbl_Student_Admission 
) v1 
where years between 1990 and 1992 

SQL Fiddle

+0

+1 к точке и стандарту – whytheq

+0

«int» имеет более высокий приоритет по сравнению с строкой, поэтому преобразование фактически происходит наоборот. Если вы заботитесь о производительности, ни один из 7 ответов, представленных здесь, не должен использоваться. Все они не могут быть конкурентоспособными. 'SELECT DATEPART (yy, dob) AS years FROM dbo.tbl_Student_Admission WHERE dob> = '19900101' AND dob <'19930101'' лучше. –

3

Вы можете использовать его как это ...

select * from (
select DATEPART(yy, dob) as years from dbo.tbl_Student_Admission 
) abc 
where years between '1990' and '1992' 

Но это не лучший способ ... это будет вниз ваш производительность запросов. Таким образом, вы должны использовать следующий запрос ..

select DATEPART(yy, dob) as years from dbo.tbl_Student_Admission where DATEPART(yy, dob) between '1990' and '1992' 
+2

Добавление производной таблицы (вещь 'abc') ничего не изменит в отношении производительности. –

1

Первое заметное аспект SQL, который отличается от других языков программирования является порядком, в котором обрабатывается код. В большинстве языков программирования код обрабатывается в том порядке, в котором он написан. В SQL, то первый пункт, который обрабатывается является

FROM clause,then Where -> Group By -> Having-> Select -> Order By 

так ВЫБРАТЬ положение, которое появляется первым, обрабатывается почти последним. Таким образом, вы не можете ссылаться на периоды столбцов с псевдонимом из списка выбора в разделе where, потому что он еще не рассчитан. Вы должны написать:

select [years] from (
select DATEPART(yy, dob) as years 
from dbo.tbl_Student_Admission 
) T 
where T.years between 1990 and 1992 
+0

+1 для подробного описания фаз обработки логических запросов – whytheq

3

Существует очень простой способ. так почему нужно идти сложным? Вы должны попробовать это. Это сработает.

Select DATEPART(yy, dob) as 'years' 
From dbo.tbl_Student_Admission 
Where DATEPART(yy, dob) between '1990' and '1992' 
0

CTE альтернатива:

WITH myCTE 
    AS 
    (
    SELECT years = DATEPART(yy, dob) 
    FROM dbo.tbl_Student_Admission 
    ) 
SELECT * 
FROM myCTE 
WHERE years BETWEEN 1990 AND 1992 
0

Решение с cross apply

SELECT t.*, c.y 
FROM dbo.tbl_Student_Admission t 
CROSS APPLY 
(
SELECT DATEPART(yy, t.years) as y 
) c 
WHERE c.y between 1990 and 1994 
Смежные вопросы