SQL Server: рассчитывать на основе даты и двух разных времен - PullRequest
2 голосов
/ 10 декабря 2010

ОС - WindowsXP

SQL Server Management Studio 2008 R2

Я пытаюсь подсчитать количество проектов на основе даты выпуска, НЕ даты и ВРЕМЕНИ.Однако некоторые проекты имеют одинаковую дату выпуска, но разное время и рассматриваются как отдельный проект.Пока проект имеет ту же дату, я хочу, чтобы она была засчитана.

'Releasedate' на сервере - это "datetime"

Select ProjectName, count(ProjectName) as Count, (Releasedate)
From DBTable Where Releasedate >= convert(nvarchar,(getdate())) 
Group by   projectname,releasedt

Текущие результаты:

 ProjectName       Count        Releasedate

 Project_Nm_1      1             2010-03-27 00:00:00
 Project_Nm_1      1             2010-03-27 08:00:00
 Project_Nm_2      1             2010-03-27 00:00:00
 Project_Nm_2      1             2010-03-27 08:00:00

Хотелось бы увидеть:

 Project_Nm_1      2             2010-03-27
 Project_Nm_2      2             2010-03-27 

Ответы [ 6 ]

3 голосов
/ 10 декабря 2010

SQL Server 2008 представил новый тип данных DATE, который делает именно то, что вы ищете - обрабатывает только дату, без какого-либо времени. Так что просто CAST ваше поле до DATE и все будет в порядке:

SELECT 
   ProjectName, COUNT(ProjectName) as Count, CAST(Releasedate AS DATE)
FROM 
   dbo.DBTable 
WHERE 
   CAST(Releasedate AS DATE) >= CAST(GETDATE() AS DATE)
GROUP BY 
   projectname, CAST(ReleaseDate as DATE)
1 голос
/ 10 декабря 2010

Чтобы сгруппировать только по дате, попробуйте использовать функцию CONVERT:

GROUP BY projectname, CONVERT(nvarchar, Releasedate, 101)

Вы захотите использовать тот же вызов функции CONVERT в списке столбцов выбора, чтобы в выводе запроса также отображалась только дата.

Взгляните на: http://codingforums.com/showthread.php?t=56536

0 голосов
/ 10 декабря 2010

Объяснить:

declare @dt datetime
set @dt = '2010/12/22 12:34:56'
print @dt
print convert(char(8), @dt, 112)

Результат:

Dec 22 2010 12:34PM
20101222

Итак, используйте

GROUP BY convert(char(8), releasedt, 112)
0 голосов
/ 10 декабря 2010

Вы можете получить часть даты datetime ReleaseDate, используя

DateAdd(dd, 0, DateDiff(dd, 0, ReleaseDate))

Поэтому ваш запрос становится

SELECT 
    ProjectName,
    Count(ProjectName) as Count,
    DateAdd(dd, 0, DateDiff(dd, 0, ReleaseDate)) as ReleaseDate
FROM
    DBTable
WHERE
    ReleaseDate >= getdate()
GROUP BY
    ProjectName,
    DateAdd(dd, 0, DateDiff(dd, 0, ReleaseDate))

Если вы обнаружите, что часто удаляете время из даты и времени, то инкапсулируйте егов UDF.

0 голосов
/ 10 декабря 2010

Вы можете просто GROUP BY части даты, которые вы хотите использовать DATEPART

SELECT
    ProjectName,
    Count(*),
    DATEPART(year, Releasedate) as ReleaseYear,
    DATEPART(month, Releasedate) as ReleaseMonth,
    DATEPART(day, Releasedate) as ReleaseDay
FROM
    DBTable 
WHERE
    Releasedate >= convert(nvarchar,(getdate()))
GROUP BY
    ProjectName,
    DATEPART(year, Releasedate),
    DATEPART(month, Releasedate),
    DATEPART(day, Releasedate)

Я оставлю объединение этих частей в одном поле как упражнение для вас, если вы хотите, но это будет игнорировать временную часть Releasedate при группировке

0 голосов
/ 10 декабря 2010
Select 
    ProjectName, count(ProjectName) as CountProjects, Releasedate
From 
    DBTable 
Where 
    Releasedate >= convert(nvarchar, getdate()) 
Group by   
    projectname,releasedt
Order by 
    CountProjects desc

PS Не используйте встроенные функции при выборе псевдонима любого столбца

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