Member 12183079 Ответов: 1

Как искать данные за месяц и год


Declare @year Varchar(100)=2018
Declare @month Varchar(100)=3

SELECT Shrimp_Name,Grades,Japan,EU,US  
 FROM (  
 SELECT MSN.Shrimp_Name,TMG.ID,TMG.Grades,TMR.Region_Name,TSP.Price from   
 Tbl_Shrimp_Price TSP  
 inner join Tbl_Mast_Shrimp_Region TMR On  TMR.ID=TSP.Region  
 inner join Tbl_Mast_Shrimp_Grades TMG On TMG.ID=TSP.Grade  
 inner join Tbl_Mast_Shrimp_Name MSN On MSN.ID=TSP.ShrimpType  
 WHERE TSP.ShrimpType=1 and TSP.PeriodType=@PeriodType AND 
 --PostMonth =cast('01-'+@year1 as Varchar(20))
 year(PostMonth) = @year AND  
 MONTH(PostMonth)=@month  
 ) as s  
 PIVOT  
 (  
 SUM(Price)  
 FOR [Region_Name] IN (Japan, EU, US)  
 )AS pvt  
 ORDER BY Shrimp_Name,Grades  

SELECT Shrimp_Name,Grades,Japan,EU,US
FROM (
SELECT MSN.Shrimp_Name,TMG.ID,TMG.Grades,TMR.Region_Name,TSP.Price from
Tbl_Shrimp_Price TSP
inner join Tbl_Mast_Shrimp_Region TMR On  TMR.ID=TSP.Region
inner join Tbl_Mast_Shrimp_Grades TMG On TMG.ID=TSP.Grade
inner join Tbl_Mast_Shrimp_Name MSN On MSN.ID=TSP.ShrimpType
WHERE TSP.ShrimpType=2  and TSP.PeriodType=@PeriodType
AND --PostMonth = cast('01-'+@year1 as Varchar(20))
year(PostMonth) = @year AND
MONTH(PostMonth)=@month
) as s
PIVOT
(
SUM(Price)
FOR [Region_Name] IN (Japan, EU, US)
)AS pvt
ORDER BY Shrimp_Name,Grades


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

выше мой запрос я хочу искать данные из месяца и года, но когда я ищу данные из этого запроса в местоположении @month Я ставлю день означает(@month=1), то этот запрос выбирает данные так, как искать данные из месяца и года, Пожалуйста, помогите мне-

PostMonth - это мое имя столбца и формат сохранения данных ниже-
01-03-2018

MadMyche

При публикации вопросов, связанных с БД, рекомендуется добавить, какой тип СУБД используется, а также схему таблицы.
При работе с датами и/или временем часто проще всего работать с типом данных DATE, а затем использовать INT для частей (год, месяц, день). Использование типа text (VARCHAR) и попытка сделать математику внутри него часто заканчиваются тем, что вы не собирались делать

1 Ответов

Рейтинг:
12

Wendelius

Если я правильно понимаю, дата хранится в столбце a varchar и принимается, что это SQL Server. Если это так, один простой способ-преобразовать его в дату, а затем выполнить сравнение. Например

...
AND DATEPART(year, CONVERT(date, PostMonth, 105)) = @year 
AND DATEPART(month, CONVERT(date, PostMonth, 105)) = @month
...

Однако фактическая коррекция будет заключаться в том, чтобы хранить дату внутри столбца даты. Это значительно упростило бы сравнение и позволило бы исключить все ненужные преобразования. То же самое относится и к переменным, поскольку кажется, что вы использовали для них varchar, хотя на самом деле это числа.


Member 12183079

спасибо

Wendelius

Пожалуйста.