akhter86 Ответов: 4

Как разделить день от даты


 Posted an hour ago
i have made sql query for pivot Attendance ,my output is 

5-1-2019	6-1-2019	7-1-2019	8-1-2019
P	A 	P	A
 

But I want this Output 

5	6	7	8
P	A 	P	A


Что я уже пробовал:

ALTER Procedure [dbo].[PIvot_Attendance]  
As  
Begin 

SELECT DISTINCT (date) as date INTO #Datessss
FROM EmployeeAtt
ORDER BY date


DECLARE @cols NVARCHAR(4000)
SELECT  @cols = COALESCE(@cols + ',[' + CONVERT(varchar, (date), 106)
				+ ']','[' + CONVERT(varchar, date, 106) + ']')
FROM    #Datessss
ORDER BY date




-- Building the query with dynamic dates
DECLARE @qry NVARCHAR(4000)
SET @qry =
'SELECT * FROM
(SELECT empcode, Day ,(date)
FROM EmployeeAtt)emp
PIVOT (MAX(Day) FOR date IN (' + @cols + ')) AS stat'


-- Executing the query
EXEC(@qry)



End

4 Ответов

Рейтинг:
29

#realJSOP

Попробовать это:

DECLARE @qry NVARCHAR(4000) = 
N'SELECT * 
FROM (SElECT empcode, DATEPART(DAY, [date]) AS [DayOfMonth], [date]
      FROM EmployeeeAtt) AS emp
PIVOT (MAX(DATEPART(DAY, [date]) FOR [date] IN (' + cols + ')) AS stat'


akhter86

эта ошибка идет
(6 строк) затронуты)
Msg 102, Уровень 15, Состояние 1, Строка 4
Неверный синтаксис рядом с '('.

MadMyche

Затем вам нужно устранить неполадки.
На самом деле я работал над нужным вам запросом, но с очень плохим столбцом и псевдонимами (день, дата) Я даже не потрудился закончить.

#realJSOP

Будьте программистом и исправьте это. Я набрал его с самого начала, не прибегая к проверке синтаксиса ssms.

Member 12314309

Спасибо Джону Симмонсу ,я исправил свой выданный

Maciej Los

5ed!

Рейтинг:
0

OriginalGriff

Начните с изменения базы данных: не храните элементы date или based в текстовых полях, вместо этого используйте DATE, DATETIME или DATETIME2.
Проблема с текстовыми полями заключается в том, что они могут - и в какой - то момент это произойдет-содержать информацию, отличную от даты, или информацию о дате в другом формате, чем вы ожидаете. И без контекста, предоставленного пользователем, когда он был введен (которого у вас нет, как только он достигает БД), вы не можете сказать, если 01/02/03 это первое февраля 2003 года, второе января 2003 года или третье февраля 2001 года.
Когда вы добавляете, что текстовые поля сортируются как текст, а не даты - так что сравнение полностью зависит от первой пары различных символов - это становится чрезвычайно неуклюжим и трудным для работы с текстовыми полями.
Использование полей даты для получения информации о дате означает, что все это уходит, и вы можете использовать встроенные функции SQL для манипулирования данными, такие как DATEPART.

Серьезно, измените свою БД сейчас, прежде чем это станет большой работой или, что еще хуже, плохие данные "реального мира" попадут в вашу производственную БД.


Рейтинг:
0

MadMyche

То, что вы ищете, - это DatePart функция
DATEPART (Transact-SQL) - SQL Server | Microsoft Docs[^]


Maciej Los

5ed!