Sql 如何使用时间函数获取小时数据

Sql 如何使用时间函数获取小时数据,sql,Sql,我试图在一个表上获取每小时的数据,该表在mysql上运行良好,但在sql上运行不好。如何在sql server managmenmt studio中使用此函数,我收到的“time”不是可识别的函数名。curdate()不是可识别的函数名 select [pa_number], [pa_surname] ,[pa_forename], sum(time(datetime) >= '07:00:00' and time(datetime) < '08:0

我试图在一个表上获取每小时的数据,该表在mysql上运行良好,但在sql上运行不好。如何在sql server managmenmt studio中使用此函数,我收到的“time”不是可识别的函数名。curdate()不是可识别的函数名

  select  [pa_number], [pa_surname]
      ,[pa_forename],
        sum(time(datetime) >= '07:00:00' and time(datetime) < '08:00:00') as '7.00-8.00 AM',  
       sum(time(datetime) >= '08:00:00' and time(datetime) < '09:00:00') as '8.00-9.00 AM',  
       sum(time(datetime) >= '09:00:00' and time(datetime) < '10:00:00') as '9.00-10.00 AM ',  
       sum(time(datetime) >= '10:00:00' and time(datetime) < '11:00:00') as '10.00-11.00 AM',   
       sum(time(datetime) >= '11:00:00' and time(datetime) < '12:00:00') as '11.00-12.00 AM',   
   sum(time(datetime) >= '12:00:00' and time(datetime) < '13:00:00') as '12.00-1.00 PM',   
   sum(time(datetime) >= '13:00:00' and time(datetime) < '14:00:00') as '1.00-2.00 PM',   
   sum(time(datetime) >= '14:00:00' and time(datetime) < '15:00:00') as '2.00-3.00 PM',  
   sum(time(datetime) >= '15:00:00' and time(datetime) < '16:00:00') as '3.00-4.00 PM',   
   sum(time(datetime) >= '16:00:00' and time(datetime) < '17:00:00') as '4.00-5.00 PM',  
   sum(time(datetime) >= '17:00:00' and time(datetime) < '18:00:00') as '5.00-6.00 PM',  
   sum(time(datetime) >= '18:00:00' and time(datetime) < '19:00:00') as '6.00-7.00 PM'   



 from [ICPS].[dbo].[parking_attendants] t  
   inner join tickets a  
   on t.[pa_number] = a.[t_pa_number]  

  where cast(t.DATETIME AS DATE) = CURDATE()  
  group by pa_surname 
选择[pa_编号],[pa_姓氏]
,[pa_的名字],
总和(时间(日期时间)>='07:00:00'和时间(日期时间)<'08:00:00')为'7.00-8.00 AM',
总和(时间(日期时间)>='08:00:00'和时间(日期时间)<'09:00:00')为'8.00-9.00 AM',
总和(时间(日期时间)>='09:00:00'和时间(日期时间)<'10:00:00')为'9.00-10.00 AM',
总和(时间(日期时间)>='10:00:00'和时间(日期时间)<'11:00:00')为'10.00-11.00 AM',
总和(时间(日期时间)>='11:00:00'和时间(日期时间)<'12:00:00')为'11.00-12.00 AM',
总和(时间(日期时间)>='12:00:00'和时间(日期时间)<'13:00:00')为'12.00-1.00 PM',
总和(时间(日期时间)>='13:00:00'和时间(日期时间)<'14:00:00')为'1.00-2.00 PM',
总和(时间(日期时间)>='14:00:00'和时间(日期时间)<'15:00:00')为'2.00-3.00 PM',
总和(时间(日期时间)>='15:00:00'和时间(日期时间)<'16:00:00')为'3.00-4.00 PM',
总和(时间(日期时间)>='16:00:00'和时间(日期时间)<'17:00:00')为'4.00-5.00 PM',
总和(时间(日期时间)>='17:00:00'和时间(日期时间)<'18:00:00')为'5.00-6.00 PM',
总和(时间(日期时间)>='18:00:00'和时间(日期时间)<'19:00:00')为'6.00-7.00 PM'
来自[ICPS].[dbo].[parking\u Attendars]t
内联票a
关于t.[pa_数]=a.[t_pa_数]
其中cast(t.DATETIME作为日期)=CURDATE()
帕乌姓分组
第一部分可以使用
SUM(7到8之间的DATEPART(HOUR,t.datetime)
等,第二部分可以使用
CAST(GETDATE()AS DATE)


在SQL Server中,MySQL
time()
函数没有完全等效的函数。也就是说,在您的示例中,可以使用SQL Server的
DatePart()
函数

但是,在SQL Server中,MySQL
CURDATE()
函数确实有一个等效项:
GetDate()
(对于本地日期时间数据)、
GetUtcDate()
(对于UTC[aka.GMT]datetime数据)或
SysDateTimeOffset()
(对于datetimeoffset[datetime with timezone]数据)

您的SQL语句可以重新编写为:

SELECT
    [pa_number],
    [pa_surname],
    [pa_forename],
    Sum(CASE WHEN DatePart(hour, [datetime]) >=  7 AND DatePart(hour, [datetime]) <  8 THEN 1 ELSE 0 END) AS '7.00-8.00 AM',
    Sum(CASE WHEN DatePart(hour, [datetime]) >=  8 AND DatePart(hour, [datetime]) <  9 THEN 1 ELSE 0 END) AS '8.00-9.00 AM',
    Sum(CASE WHEN DatePart(hour, [datetime]) >=  9 AND DatePart(hour, [datetime]) < 10 THEN 1 ELSE 0 END) AS '9.00-10.00 AM',
    Sum(CASE WHEN DatePart(hour, [datetime]) >= 10 AND DatePart(hour, [datetime]) < 11 THEN 1 ELSE 0 END) AS '10.00-11.00 AM',
    Sum(CASE WHEN DatePart(hour, [datetime]) >= 11 AND DatePart(hour, [datetime]) < 12 THEN 1 ELSE 0 END) AS '11.00-12.00 PM',
    Sum(CASE WHEN DatePart(hour, [datetime]) >= 12 AND DatePart(hour, [datetime]) < 13 THEN 1 ELSE 0 END) AS '12.00-1.00 PM',
    Sum(CASE WHEN DatePart(hour, [datetime]) >= 13 AND DatePart(hour, [datetime]) < 14 THEN 1 ELSE 0 END) AS '1.00-2.00 PM',
    Sum(CASE WHEN DatePart(hour, [datetime]) >= 14 AND DatePart(hour, [datetime]) < 15 THEN 1 ELSE 0 END) AS '2.00-3.00 PM',
    Sum(CASE WHEN DatePart(hour, [datetime]) >= 15 AND DatePart(hour, [datetime]) < 16 THEN 1 ELSE 0 END) AS '3.00-4.00 PM',
    Sum(CASE WHEN DatePart(hour, [datetime]) >= 16 AND DatePart(hour, [datetime]) < 17 THEN 1 ELSE 0 END) AS '4.00-5.00 PM',
    Sum(CASE WHEN DatePart(hour, [datetime]) >= 17 AND DatePart(hour, [datetime]) < 18 THEN 1 ELSE 0 END) AS '5.00-6.00 PM',
    Sum(CASE WHEN DatePart(hour, [datetime]) >= 18 AND DatePart(hour, [datetime]) < 19 THEN 1 ELSE 0 END) AS '6.00-7.00 PM'
FROM
    [ICPS].[dbo].[parking_attendants] AS t
    INNER JOIN [tickets] AS a
        ON ( a.[t_pa_number] = t.[pa_number] )
WHERE
    /* Cast(t.[datetime] AS date) = Cast(GetDate() AS date) --Commented out during edit */
    DateAdd(day, DateDiff(day, 0, Cast(t.[datetime] AS datetime)), 0) = DateAdd(day, DateDiff(day, 0, GetDate()), 0)
GROUP BY
    [pa_number],
    [pa_surname],
    [pa_forename]
选择
[pa_编号],
[帕乌姓],
[帕乌的名字],
总和(当DatePart(小时,[datetime])>=7和DatePart(小时,[datetime])<8时,则为1,否则为0结束)为'7.00-8.00 AM',
总和(当DatePart(小时,[datetime])>=8和DatePart(小时,[datetime])<9时,则为1,否则为0结束)为'8.00-9.00 AM',
总和(当DatePart(小时,[datetime])>=9和DatePart(小时,[datetime])<10时,则为1,否则为0结束)为'9.00-10.00 AM',
总和(当DatePart(小时,[datetime])>=10且DatePart(小时,[datetime])<11时,则为1,否则为0结束)为'10.00-11.00 AM',
总和(当DatePart(小时,[datetime])>=11和DatePart(小时,[datetime])<12时,则为1,否则为0结束)为'11.00-12.00 PM',
总和(当DatePart(小时,[datetime])>=12和DatePart(小时,[datetime])<13时,则为1,否则为0结束)为'12.00-1.00 PM',
总和(当DatePart(小时,[datetime])>=13和DatePart(小时,[datetime])<14时,则为1,否则为0结束)为'1.00-2.00 PM',
总和(当DatePart(小时,[datetime])>=14和DatePart(小时,[datetime])<15时,则为1,否则为0结束)为“下午2:00-3:00”,
总和(当DatePart(小时,[datetime])>=15和DatePart(小时,[datetime])<16时,则为1,否则为0结束)为“下午3:00-4:00”,
总和(如果DatePart(小时,[datetime])>=16,DatePart(小时,[datetime])<17,则为1,否则为0结束)为“下午4:00-5:00”,
总和(当DatePart(小时,[datetime])>=17和DatePart(小时,[datetime])<18时,则为1,否则为0结束)为“下午5:00-6:00”,
总和(当DatePart(小时,[datetime])>=18和DatePart(小时,[datetime])<19时,则为1,否则为0结束)为“下午6:00-7:00”
从…起
[ICPS].[dbo].[parking_Attendant]作为t
内部连接[票]作为一个
ON(a[t\U pa\U编号]=t[t\U编号])
哪里
/*强制转换(t.[datetime]作为日期)=强制转换(GetDate()作为日期)--在编辑过程中注释掉*/
DateAdd(day,DateDiff(day,0,强制转换(t.[datetime]作为datetime)),0)=DateAdd(day,DateDiff(day,0,GetDate()),0)
分组
[pa_编号],
[帕乌姓],
[帕乌名字]
在您的情况下,请注意SQL Server的
BETWEEN
运算符,因为它包含在测试的数据元素中:

如果test_表达式的值大于或等于begin_表达式的值且小于或等于end_表达式的值,则BETWEEN返回TRUE


编辑:根据您的评论,您使用的是SQL Server 2000或2005,两者都没有日期数据类型。SQL语句(以上)已修改为使用更通用的datetime数据类型。语句的
DateAdd(day,DateDiff(day,0,{datetime}),0)
部分用于清除日期时间的时间部分(即,###:##=>00:00:00)。这允许将两个日期时间作为伪日期数据类型进行比较(sans-time)。

这与哪些RDM有关?sql server管理手册与Postgres类似-如果是sql server,我会按日期部分(小时,日期时间)分组-不确定Postgres中是否有相同的函数?“CURDATE”不是sql server中可识别的内置函数名?不过,我似乎从我的博士后时代就记得它了?类型日期不是一个定义的系统类型。我收到这个错误答案已修改为SQL Server 2000+兼容。