Выберите диапазон дат из строки - PullRequest
0 голосов
/ 12 марта 2012

Я только что унаследовал базу данных, он вставил все даты в виде строк, так данные выглядят так

19730815 ...... no further comment on that!

Мне нужно выбрать всех, кто родился в марте, в возрасте от 5 до 15 лет. пожалуйста, помогите мне с этим запросом t-sql спасибо

select * from A1 where DBate = ?????

Ответы [ 6 ]

1 голос
/ 12 марта 2012

вы можете использовать функцию SUBSTRING в sql, чтобы удалить месяц и дату из строки и сравнить их, чтобы найти возраст и месяц рождения.

1 голос
/ 12 марта 2012

попробуйте

select * from A1 where month(convert(datetime, DBate))=3 and (year(getdate)-year(convert(datetime, '20161023'))) between 5 and 15
0 голосов
/ 13 марта 2012
SELECT *
FROM Contacts
WHERE dbo.AgeInYears(dbo.DateFromDigits(DateOfBirth)) BETWEEN 5 AND 15
AND MONTH(dbo.DateFromDigits(DateOfBirth)) = 3

Функции DateFromDigits и AgeInYears определены здесь:

CREATE FUNCTION DateFromDigits(@digits int) RETURNS smalldatetime AS
BEGIN
    RETURN
        CASE WHEN ISDATE(CAST(@digits AS char(8))) = 1
            THEN CAST(CAST(@digits AS char(8)) AS smalldatetime)
        END
END

CREATE FUNCTION AgeInYears(@date smalldatetime) RETURNS int AS
BEGIN
    RETURN
        (SELECT DATEDIFF(YY, @date, GETDATE()) -
            CASE WHEN (MONTH(@date) = MONTH(GETDATE())
                    AND DAY(@date) > DAY(GETDATE()))
                    OR MONTH(@date) > MONTH(GETDATE())
                THEN 1 ELSE 0
            END)
END
0 голосов
/ 12 марта 2012

Сочетание датированных () и datepart (). Этот пример учитывает точные даты при определении возраста в годах.

declare @today datetime; set @today=getdate(); --or declare @today date if SQL 2008+

-- Build some sample data
declare @bds table(id int identity(1,1),bd varchar(8));

insert into @bds values ('19730815') --out of range
, ('20070310') --in range when @today is on or after 3/10/2012
, ('20070315') --out of range when @today is before 3/15/2012
, ('20070801') --out of range
, ('20040305') --in range when @today is on or after 3/05/2012

-- Find ages 5 to 15, born in March
select *
, age=DATEDIFF(yyyy,bd,@today)
    -Case when DATEADD(yyyy,-DATEDIFF(yyyy,bd,@today),@today)>bd then 0 else 1 end
from @bds
where DATEDIFF(yyyy,bd,@today)
    -Case when DATEADD(yyyy,-DATEDIFF(yyyy,bd,@today),@today)>bd then 0 else 1 end
between 5 and 15
and datepart(mm,bd)=3 -- or month(d) in SQL 2008+

Результат, с @ today = 3.12.2012:

id          bd       age
----------- -------- -----------
2           20070310 5
5           20040305 8
0 голосов
/ 12 марта 2012

Поскольку это int, вам весело провести время с операторами \ и%, чтобы вернуть год и месяц:

SELECT *
FROM A1
WHERE
    (DBate/100)%100 = 3
AND
    (YEAR(GETDATE()) - (DBate/10000)) BETWEEN 5 AND 15
0 голосов
/ 12 марта 2012

Что ж, вы можете выполнить некоторые манипуляции со строками, чтобы создать пригодный для использования DateTime, который затем можно использовать для выполнения DateDiff для текущей даты, и используйте предложение Between для фильтрации по диапазону этих DateDiff.Может быть, что-то вроде этого:

select * 
from A1 
where DBate = DateDiff(yy, 
      Convert(datetime, SUBSTRING(BDate,0,4) + "-" + SUBSTRING(BDate,4,2) + "-" + SUBSTRING(BDate,6,2)), 
   GetDate()) 
   BETWEEN 5 AND 15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...