按输入日期sql过滤

时间:2019-09-16 06:21:31

标签: sql sql-server

我必须使用dd-MM-YY格式作为输入按日期过滤查询结果,当我运行查询时,它给了我一个空表,我该如何解决?

select Data, string_agg(Ore, '  ') as Ore 
from ( 
   select FORMAT(DataCreazione, 'dd/MM/yyyy', 'it-IT') as Data,
          CONCAT(DATEPART(HOUR,DataCreazione), ':', DATEPART(MINUTE, DataCreazione)) as
Ore 
   from Marcatura 
   where IdUtente = @IdUtente 
    and (Stato='Ingresso' or Stato='Uscita') 
     and (CONVERT(datetime, DataCreazione, 103) 
        between CONVERT(datetime, @Start, 103) 
            and CONVERT(datetime, @End, 103))
) t 
group by Data 
order by CONVERT(datetime, Data, 103) desc
    ​

输入值:

@IdUtente=2
@End='14-09-19'
@Start='05-02-19'

2 个答案:

答案 0 :(得分:3)

您的开始日期和结束日期均为有效的SQL格式。您可以将其转换为日期时间,但是我们需要告诉SQL原始日期是哪种格式。

cast(CONVERT(VARCHAR(10), CONVERT(date, @Start, 5), 23)  as datetime)

完整查询:

select Data, string_agg(Ore, '  ') as Ore 
from ( 
   select FORMAT(DataCreazione, 'dd/MM/yyyy', 'it-IT') as Data,
          CONCAT(DATEPART(HOUR,DataCreazione), ':', DATEPART(MINUTE, DataCreazione)) as
Ore 
   from Marcatura 
   where IdUtente = @IdUtente 
    and (Stato='Ingresso' or Stato='Uscita') 
     and cast(DataCreazion as DateTime)
        between cast(CONVERT(VARCHAR(10), CONVERT(date, @Start, 5), 23)  as datetime)
            and  cast(CONVERT(VARCHAR(10), CONVERT(date, @End, 5), 23)  as datetime)
) t 
group by Data 
order by CONVERT(datetime, Data, 5) desc

答案 1 :(得分:0)

相反,您可以像下面那样设置连接级别属性。

SET DATEFORMAT DMY;

SELECT Data
    ,string_agg(Ore, '  ') AS Ore
FROM (
    SELECT FORMAT(DataCreazione, 'dd/MM/yyyy', 'it-IT') AS Data
        ,CONCAT (DATEPART(HOUR, DataCreazione),':',DATEPART(MINUTE, DataCreazione)) AS Ore
    FROM Marcatura
    WHERE IdUtente = @IdUtente
        AND (Stato = 'Ingresso' OR Stato = 'Uscita')
        AND (
              DataCreazione  BETWEEN   @Start and @End 
            )
    ) t
GROUP BY Data
ORDER BY CONVERT(DATETIME, Data, 103) DESC