Начиная с Windows 8.1, GetVersion()
и GetVersionEx()
подлежат проявлению приложения:
С выпуском Windows 8.1, поведение API
GetVersionEx
изменилось в значении, которое оно вернет для версии операционной системы. Значение, возвращаемое функциейGetVersionEx
, теперь зависит от того, как проявляется приложение.Приложения, которые не отображаются для Windows 8.1 или Windows 10, вернут значение версии ОС Windows 8 (6.2). Когда приложение проявляется для данной версии операционной системы,
blockquote>GetVersionEx
всегда будет возвращать версию, в которой приложение проявляется в будущих выпусках. Чтобы продемонстрировать свои приложения для Windows 8.1 или Windows 10, см. Ориентация вашего приложения на Windows .Новые функции 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:
Чтобы получить полный номер версии для операционной системы, вызовите функцию
blockquote>GetFileVersionInfo
в одной из системных DLL, напримерKernel32.dll
, затем вызовитеVerQueryValue
для получения подблока\\StringFileInfo\\
информации о версии файла.\\ProductVersion Другой способ - использовать
RtlGetVersion()
,NetServerGetInfo()
, илиNetWkstaGetInfo()
. Они все сообщают точную версию ОС и не подлежат манифестации (пока?).
Примечание: я отредактировал это для фиксации то, чему я верю, была значительная ошибка. В настоящее время отправляемая версия работает на меня.
Это должно работать после изменения имен полей и имен таблиц для соответствия базе данных.
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. Таким образом, это возвращает все те записи.
Предстоящий день рождения для сотрудника - 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)
Я считаю, что этот билет был закрыт давным-давно, но для получения правильного 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))
Надеюсь, это поможет тебе ...
select Employeename,DOB
from Employeemaster
where day(Dob)>day(getdate()) and month(DOB)>=month(getDate())
Решение для 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 декабря.))
Гайки! Хорошее решение между тем, когда я начал думать об этом и когда я возвратился к ответу.:)
я придумал:
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 () как дата и время, правильно?
Я столкнулся с той же проблемой с моим проектом колледжа несколько лет назад. Я ответил (довольно ласково), разделив год и дату (ММ: ДД) на две отдельные колонки. А до этого мой напарник просто собирал все даты и программно проходил их. Мы изменили это, потому что это было слишком неэффективно - не то, чтобы мое решение было более элегантным. Кроме того, это, вероятно, невозможно сделать в базе данных, которая некоторое время использовалась несколькими приложениями.
Это должно работать...
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))
Другая мысль: Добавьте их возраст в целых годах к их дню рождения (или еще один, если их День рождения еще не произошел и затем выдерживает сравнение, как Вы делаете выше. Используйте DATEPART и DATEADD, чтобы сделать это.
http://msdn.microsoft.com/en-us/library/ms186819.aspx
пограничный случай диапазона, охватывающего год, должен был бы иметь специальный код.
Бонусная подсказка: рассмотрите использование МЕЖДУ... И Вместо того, чтобы повторить операнд Дня рождения.
Большинство этих решений близко, но необходимо помнить несколько дополнительных сценариев. При работе со днями рождения и скользящей шкалой, необходимо быть в состоянии обработать переход в следующий месяц.
, Например, пример Stephens работает отлично на дни рождения вплоть до прошлых 4 дней месяца. Тогда у Вас есть логический отказ как допустимые даты, если бы сегодня было 29-м, то был бы:29, 30, И затем 1, 2, 3 из месяца NEXT, таким образом, необходимо обусловить для этого также.
альтернатива должна была бы проанализировать дату от поля дня рождения и sub в текущем году, затем сделать стандартное сравнение диапазона.
Предполагая, что это T-SQL, используйте DATEPART для сравнения месяца и даты отдельно.
http://msdn.microsoft.com/en-us/library/ms174420.aspx
В качестве альтернативы вычтите 1 января текущего года из дня рождения каждого, а затем сравните, используя 1900 год (или любой другой год вашей эпохи).
Вы могли использовать DATE_FORMAT для извлечения частей дня и месяца дат дня рождения.
РЕДАКТИРОВАНИЕ: извините я не видел, что он не использовал MySQL.
Менее чем за месяц: & 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() ))))
Попробуйте:
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)
Извините, не вижу требования нейтрализовать год.
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)
Это должно работать.
Вы могли использовать эти DAYOFYEAR
функция, но быть осторожными, когда Вы хотите искать дни рождения в январе в декабре. Я думаю, что Вы будете в порядке пока диапазон дат, который Вы ищете, не охватывает Новый год.
Понравился подход @strelc, но его sql был немного выключен. Вот обновленная версия, которая работает хорошо и проста в использовании:
SELECT * FROM User
WHERE (DATEDIFF(dd, getdate(), DATEADD(yyyy,
DATEDIFF(yyyy, birthdate, getdate()) + 1, birthdate)) + 1) % 366 <= <number of days>
редактировать 10/2017: добавить один день до конца
Лучшее использование datediff и dateadd. Никакое округление, нет приближается, нет 29-го февраля ошибка, только функции даты
ageOfThePerson = DATEDIFF(yyyy,dateOfBirth, GETDATE())
dateOfNextBirthday = DATEADD(yyyy,ageOfThePerson + 1, dateOfBirth)
daysBeforeBirthday = DATEDIFF(d,GETDATE(), dateofNextBirthday)
Благодаря @Gustavo Cardoso, новому определению для возраста человека
ageOfThePerson = FLOOR(DATEDIFF(d,dateOfBirth, GETDATE())/365.25)
Если кто-то все еще ищет решение в 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)
Лучше, Добавьте различие в годах на дату ДНЯ РОЖДЕНИЯ, сделать все в этом году, и затем сделать Ваш выдерживают сравнение
SELECT * FROM Employees WHERE
DATEADD ( year, YEAR(@Today) - YEAR(@Birthday), birthday) BETWEEN @Today AND @EndDate
Это комбинация пары ответов, которые были протестированы. В ней указывается следующий день после определенной даты и возраст, в котором они будут получены. Также число дней ограничит диапазон, который вы ищете 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
Лучший способ добиться того же -
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)