Выбор SQL предстоящие дни рождения

Начиная с Windows 8.1, GetVersion() и GetVersionEx() подлежат проявлению приложения:

С выпуском Windows 8.1, поведение API GetVersionEx изменилось в значении, которое оно вернет для версии операционной системы. Значение, возвращаемое функцией GetVersionEx, теперь зависит от того, как проявляется приложение.

Приложения, которые не отображаются для Windows 8.1 или Windows 10, вернут значение версии ОС Windows 8 (6.2). Когда приложение проявляется для данной версии операционной системы, GetVersionEx всегда будет возвращать версию, в которой приложение проявляется в будущих выпусках. Чтобы продемонстрировать свои приложения для Windows 8.1 или Windows 10, см. Ориентация вашего приложения на Windows .

blockquote>

Новые функции Version Helper просто обертки для VerifyVersionInfo() . Начиная с Windows 10, он также подвержен манифестации:

Windows 10: VerifyVersionInfo возвращает false при вызове приложениями, которые не имеют манифест совместимости для Windows 8.1 или Windows 10, если параметр lpVersionInfo установлен так, чтобы он указывал Windows 8.1 или Windows 10, даже если текущая версия операционной системы - Windows 8.1 или Windows 10. В частности, VerifyVersionInfo имеет следующее поведение:

  • Если приложение не имеет манифеста, VerifyVersionInfo ведет себя так, как если бы операционная система была версией Windows 8 (6.2).
  • Если приложение имеет манифест, содержащий GUID, соответствующий Windows 8.1, VerifyVersionInfo ведет себя так, как если бы операционная система была версией Windows 8.1 (6.3).
  • Если приложение имеет манифест, содержащий GUID, соответствующий Windows 10, VerifyVersionInfo ведет себя так, как если бы операционная система была Windows 10 (10.0).

Функции Version Helper используют функцию VerifyVersionInfo, поэтому поведение IsWindows8Point1OrGreater и IsWindows10OrGreater также подвержены влиянию присутствия и содержимого манифеста.

Чтобы продемонстрировать свои приложения для Windows 8.1 или Windows 10, см. Ориентация на приложение для Windows .

blockquote>

Чтобы получить истинную версию ОС независимо от ее проявления, Microsoft предлагает запросить версию файла системной DLL:

Получение системы Версия

Чтобы получить полный номер версии для операционной системы, вызовите функцию GetFileVersionInfo в одной из системных DLL, например Kernel32.dll, затем вызовите VerQueryValue для получения подблока \\StringFileInfo\\\\ProductVersion информации о версии файла.

blockquote>

Другой способ - использовать RtlGetVersion() , NetServerGetInfo() , или NetWkstaGetInfo() . Они все сообщают точную версию ОС и не подлежат манифестации (пока?).

25
задан Crob 17 September 2008 в 20:43
поделиться

22 ответа

Примечание: я отредактировал это для фиксации то, чему я верю, была значительная ошибка. В настоящее время отправляемая версия работает на меня.

Это должно работать после изменения имен полей и имен таблиц для соответствия базе данных.

SELECT 
  BRTHDATE AS BIRTHDAY
 ,FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()) / 365.25) AS AGE_NOW
 ,FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()+7) / 365.25) AS AGE_ONE_WEEK_FROM_NOW
FROM 
  "Database name".dbo.EMPLOYEES EMP
WHERE 1 = (FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()+7) / 365.25))
          -
          (FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()) / 365.25))

В основном, это получает # дней от их дня рождения до теперь и делит это на 365 (чтобы не округлять проблемы, которые подходят, когда Вы преобразовываете непосредственно в годы).

Тогда это получает # дней от их дня рождения до недели с этого времени и делит это на 365 для получения их возраста неделя с этого времени.

, Если их день рождения будет в течение недели, то различие между теми двумя значениями будет 1. Таким образом, это возвращает все те записи.

33
ответ дан JosephStyons 15 October 2019 в 15:28
поделиться

Предстоящий день рождения для сотрудника - Sqlserver

DECLARE @sam TABLE
(
    EmployeeIDs     int,
    dob         datetime
)
INSERT INTO @sam (dob, EmployeeIDs)
SELECT DOBirth, EmployeeID FROM Employee

SELECT *
FROM
(
    SELECT *, bd_this_year = DATEADD(YEAR, DATEPART(YEAR, GETDATE()) - DATEPART(YEAR, dob), dob)
    FROM @sam s
) d
WHERE d.bd_this_year > DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)
AND d.bd_this_year <= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 3)
0
ответ дан Bo Persson 15 October 2019 в 15:28
поделиться

Я считаю, что этот билет был закрыт давным-давно, но для получения правильного SQL-запроса, пожалуйста, посмотрите.

SELECT Employee_Name, DATE_OF_BIRTH
FROM Hr_table 
WHERE 

/**
fetching the original birth_date and replacing the birth year to the current but have to  deduct 7 days to adjust jan 1-7 birthdate.
**/

datediff(d,getdate(),DATEADD(year,datediff(year,DATEADD(d,-7,hr.DATE_OF_BIRTH),getdate()),hr.date_of_birth)) between 0 and 7

-- current date looks ahead to 7 days for upcoming modified year birth date.

order by

-- sort by no of days before the birthday
datediff(d,getdate(),DATEADD(year,datediff(year,DATEADD(d,-7,hr.DATE_OF_BIRTH),getdate()),hr.date_of_birth))
0
ответ дан Taryn 15 October 2019 в 15:28
поделиться

Надеюсь, это поможет тебе ...

select Employeename,DOB 
from Employeemaster
where day(Dob)>day(getdate()) and month(DOB)>=month(getDate())
0
ответ дан ughai 15 October 2019 в 15:28
поделиться

Решение для SQLite3 :

SELECT
    *, 
    strftime('%j', birthday) - strftime('%j', 'now') AS days_remaining
FROM
    person
WHERE :n_days >= CASE
    WHEN days_remaining >= 0 THEN days_remaining
    ELSE days_remaining + strftime('%j', strftime('%Y-12-31', 'now'))
    END
;

Решения, деленные на 325,25 для получения возраста, или переноса даты рождения на текущий год и т. Д., Не сработали для меня. Это вычисляет дельту двух дней года (1-366). Если день рождения еще не наступил в этом году, вы автоматически получите правильное количество оставшихся дней, которое вы можете сравнить. Если день рождения уже наступил, оставшиеся дни будут отрицательными, и вы можете получить правильное количество оставшихся дней, добавив общее количество дней в текущем году. Это также правильно обрабатывает високосные годы, так как в этом случае также будет добавлен дополнительный день (с помощью dayOfYear (31 декабря.))

0
ответ дан smoothware 15 October 2019 в 15:28
поделиться

Гайки! Хорошее решение между тем, когда я начал думать об этом и когда я возвратился к ответу.:)

я придумал:

select  (365 + datediff(d,getdate(),cast(cast(datepart(yy,getdate()) as varchar(4)) + '-' + cast(datepart(m,birthdt) as varchar(2)) + '-' + cast(datepart(d,birthdt) as varchar(2)) as datetime))) % 365
from    employees
where   (365 + datediff(d,getdate(),cast(cast(datepart(yy,getdate()) as varchar(4)) + '-' + cast(datepart(m,birthdt) as varchar(2)) + '-' + cast(datepart(d,birthdt) as varchar(2)) as datetime))) % 365 < @NumDays

Вы не должны бросать getdate () как дата и время, правильно?

0
ответ дан clweeks 15 October 2019 в 15:28
поделиться

Я столкнулся с той же проблемой с моим проектом колледжа несколько лет назад. Я ответил (довольно ласково), разделив год и дату (ММ: ДД) на две отдельные колонки. А до этого мой напарник просто собирал все даты и программно проходил их. Мы изменили это, потому что это было слишком неэффективно - не то, чтобы мое решение было более элегантным. Кроме того, это, вероятно, невозможно сделать в базе данных, которая некоторое время использовалась несколькими приложениями.

0
ответ дан Mostlyharmless 15 October 2019 в 15:28
поделиться

Это должно работать...

DECLARE @endDate DATETIME
DECLARE @today DATETIME

SELECT @endDate = getDate()+6, @today = getDate()

SELECT * FROM Employees 
    WHERE 
    (DATEPART (month, birthday) >= DATEPART (month, @today)
        AND DATEPART (day, birthday) >= DATEPART (day, @today))
    AND
    (DATEPART (month, birthday) < DATEPART (month, @endDate)
        AND DATEPART (day, birthday) < DATEPART (day, @endDate))
0
ответ дан bastos.sergio 15 October 2019 в 15:28
поделиться

Другая мысль: Добавьте их возраст в целых годах к их дню рождения (или еще один, если их День рождения еще не произошел и затем выдерживает сравнение, как Вы делаете выше. Используйте DATEPART и DATEADD, чтобы сделать это.

http://msdn.microsoft.com/en-us/library/ms186819.aspx

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

Бонусная подсказка: рассмотрите использование МЕЖДУ... И Вместо того, чтобы повторить операнд Дня рождения.

0
ответ дан Patrick Szalapski 15 October 2019 в 15:28
поделиться

Большинство этих решений близко, но необходимо помнить несколько дополнительных сценариев. При работе со днями рождения и скользящей шкалой, необходимо быть в состоянии обработать переход в следующий месяц.

, Например, пример Stephens работает отлично на дни рождения вплоть до прошлых 4 дней месяца. Тогда у Вас есть логический отказ как допустимые даты, если бы сегодня было 29-м, то был бы:29, 30, И затем 1, 2, 3 из месяца NEXT, таким образом, необходимо обусловить для этого также.

альтернатива должна была бы проанализировать дату от поля дня рождения и sub в текущем году, затем сделать стандартное сравнение диапазона.

0
ответ дан Mitchel Sellers 15 October 2019 в 15:28
поделиться

Предполагая, что это T-SQL, используйте DATEPART для сравнения месяца и даты отдельно.

http://msdn.microsoft.com/en-us/library/ms174420.aspx

В качестве альтернативы вычтите 1 января текущего года из дня рождения каждого, а затем сравните, используя 1900 год (или любой другой год вашей эпохи).

0
ответ дан Patrick Szalapski 15 October 2019 в 15:28
поделиться

Вы могли использовать DATE_FORMAT для извлечения частей дня и месяца дат дня рождения.

РЕДАКТИРОВАНИЕ: извините я не видел, что он не использовал MySQL.

0
ответ дан p4bl0 15 October 2019 в 15:28
поделиться

Менее чем за месяц: & nbsp;

SELECT * FROM people WHERE MOD( DATEDIFF( CURDATE( ) , `date_birth`) /30, 12 ) <1 and (((month(`date_birth`)) = (month(curdate())) and (day(`date_birth`)) > (day (curdate() ))) or ((month(`date_birth`)) > (month(curdate())) and (day(`date_birth`)) < (day (curdate() ))))
1
ответ дан Danilo 15 October 2019 в 15:28
поделиться

Попробуйте:

SELECT * FROM Employees
WHERE DATEADD(yyyy, DATEPART(yyyy, @Today)-DATEPART(yyyy, Birthday), Birthday) > @Today 
AND DATEADD(yyyy, DATEPART(yyyy, @Today)-DATEPART(yyyy, Birthday), Birthday) < DATEADD(dd, @NumDays, @Today)
0
ответ дан Esteban Brenes 15 October 2019 в 15:28
поделиться

Извините, не вижу требования нейтрализовать год.

select * from Employees
where DATEADD (year, DatePart(year, getdate()) - DatePart(year, Birthday), Birthday)
      between convert(datetime, getdate(), 101) 
              and convert(datetime, DateAdd(day, 5, getdate()), 101)

Это должно работать.

2
ответ дан Nick Berardi 15 October 2019 в 15:28
поделиться

Вы могли использовать эти DAYOFYEAR функция, но быть осторожными, когда Вы хотите искать дни рождения в январе в декабре. Я думаю, что Вы будете в порядке пока диапазон дат, который Вы ищете, не охватывает Новый год.

2
ответ дан Dave Webb 15 October 2019 в 15:28
поделиться

Понравился подход @strelc, но его sql был немного выключен. Вот обновленная версия, которая работает хорошо и проста в использовании:

SELECT * FROM User 
WHERE (DATEDIFF(dd, getdate(), DATEADD(yyyy, 
    DATEDIFF(yyyy, birthdate, getdate()) + 1, birthdate)) + 1) % 366 <= <number of days>

редактировать 10/2017: добавить один день до конца

3
ответ дан Edyn 15 October 2019 в 15:28
поделиться

Лучшее использование datediff и dateadd. Никакое округление, нет приближается, нет 29-го февраля ошибка, только функции даты

  1. ageOfThePerson = DATEDIFF(yyyy,dateOfBirth, GETDATE())

  2. dateOfNextBirthday = DATEADD(yyyy,ageOfThePerson + 1, dateOfBirth)

  3. daysBeforeBirthday = DATEDIFF(d,GETDATE(), dateofNextBirthday)

Благодаря @Gustavo Cardoso, новому определению для возраста человека

  1. ageOfThePerson = FLOOR(DATEDIFF(d,dateOfBirth, GETDATE())/365.25)
8
ответ дан ughai 15 October 2019 в 15:28
поделиться

Если кто-то все еще ищет решение в MySQL (немного другие команды), вот запрос:

SELECT
 name,birthday,
 FLOOR(DATEDIFF(DATE(NOW()),birthday) / 365.25) AS age_now,
 FLOOR(DATEDIFF(DATE_ADD(DATE(NOW()),INTERVAL 30 DAY),birthday) / 365.25) AS age_future

FROM user

WHERE 1 = (FLOOR(DATEDIFF(DATE_ADD(DATE(NOW()),INTERVAL 30 DAY),birthday) / 365.25)) - (FLOOR(DATEDIFF(DATE(NOW()),birthday) / 365.25))

ORDER BY MONTH(birthday),DAY(birthday)
15
ответ дан Andres SK 15 October 2019 в 15:28
поделиться

Лучше, Добавьте различие в годах на дату ДНЯ РОЖДЕНИЯ, сделать все в этом году, и затем сделать Ваш выдерживают сравнение

SELECT * FROM Employees WHERE
  DATEADD ( year, YEAR(@Today) - YEAR(@Birthday), birthday) BETWEEN @Today AND @EndDate
-2
ответ дан Stephen Wrighton 15 October 2019 в 15:28
поделиться

Это комбинация пары ответов, которые были протестированы. В ней указывается следующий день после определенной даты и возраст, в котором они будут получены. Также число дней ограничит диапазон, который вы ищете 7 дней = неделя и т.д.

SELECT DISTINCT FLOOR(DATEDIFF(dd,Birthday, @BeginDate) / 365.25) + 1 age,
DATEADD(yyyy, FLOOR(DATEDIFF(dd,Birthday, @BeginDate) / 365.25) + 1, Birthday) nextbirthday, birthday
FROM         table
WHERE     DATEADD(yyyy, FLOOR(DATEDIFF(dd,Birthday, @BeginDate) / 365.25) + 1, Birthday) > @BeginDate  
AND DATEADD(yyyy, FLOOR(DATEDIFF(dd,Birthday, @BeginDate) / 365.25) + 1, Birthday) < DATEADD(dd, @NumDays, @BeginDate)
order by nextbirthday
0
ответ дан 28 November 2019 в 18:19
поделиться

Лучший способ добиться того же -

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME

SELECT Member.* from vwMember AS Member  
WHERE (DATEADD(YEAR, (DATEPART(YEAR, @StartDate) -
                      DATEPART(YEAR, Member.dBirthDay)), Member.dBirthDay)
BETWEEN @StartDate AND @EndDate)
0
ответ дан 28 November 2019 в 18:19
поделиться