Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL语句不完全符合我的要求_Php_Sql_Sql Server - Fatal编程技术网

Php SQL语句不完全符合我的要求

Php SQL语句不完全符合我的要求,php,sql,sql-server,Php,Sql,Sql Server,我目前正在SQLServerManagementStudio中编写一个SQL查询,该查询将在PHP中使用 该查询的目的是获取昨天上午8点到晚上8点之间的所有记录,并计算有多少记录具有fffffff0作为cardd当前,这只吐出355条记录,列为CardCOUNT中只有第一条记录不完全符合我的要求,我应该如何做到这一点 SELECT COUNT(CardID) AS CardCOUNT, ReaderTime, controllerID, dtReading FROM

我目前正在SQLServerManagementStudio中编写一个SQL查询,该查询将在PHP中使用

该查询的目的是获取昨天上午8点到晚上8点之间的所有记录,并计算有多少记录具有
fffffff0
作为
cardd
当前,这只吐出355条记录,列为
CardCOUNT
中只有第一条记录不完全符合我的要求,我应该如何做到这一点

SELECT 
   COUNT(CardID) AS CardCOUNT,
   ReaderTime,
   controllerID,
   dtReading
FROM 
   myMachineMonitor2.dbo.ReaderData
WHERE 
   (controllerID = 31)
   AND (ReaderTime BETWEEN '08:00:00' AND '20:00:00')
   AND (CardID = 'fffffff0')
   AND (DATEDIFF(DAY, DATEADD(DAY, - 1, CURRENT_TIMESTAMP), dtReading) = 0)
GROUP BY 
   ReaderTime, controllerID, dtReading 
在玩过之后,我发现这就是我想到的

SELECT 
    COUNT(CardID) AS CardCOUNT
FROM 
    myMachineMonitor2.dbo.ReaderData
WHERE 
    (controllerID = 31)
    AND (ReaderTime BETWEEN '08:00:00' AND '20:00:00')
    AND (CardID = 'fffffff0')
    AND (DATEDIFF(DAY, DATEADD(DAY, - 0, CURRENT_TIMESTAMP), dtReading) = 0)

这会将逻辑更改为仅处理当前日期:

SELECT COUNT(CardID) AS CardCOUNT, ReaderTime, controllerID, dtReading
FROM myMachineMonitor2.dbo.ReaderData
WHERE (controllerID = 31) AND
      (CardID = 'fffffff0') AND
      dtReading >= cast(cast(getdate() as date) as datetime) - 16.0/24 and
      dtReading >= cast(cast(getdate() as date) as datetime) - 4.0/24
GROUP BY ReaderTime, controllerID, dtReading ;
对日期的转换将值设置为午夜。然后减去16小时和4小时


此表达式还执行当前日期的所有工作。

这将逻辑更改为仅处理当前日期:

SELECT COUNT(CardID) AS CardCOUNT, ReaderTime, controllerID, dtReading
FROM myMachineMonitor2.dbo.ReaderData
WHERE (controllerID = 31) AND
      (CardID = 'fffffff0') AND
      dtReading >= cast(cast(getdate() as date) as datetime) - 16.0/24 and
      dtReading >= cast(cast(getdate() as date) as datetime) - 4.0/24
GROUP BY ReaderTime, controllerID, dtReading ;
对日期的转换将值设置为午夜。然后减去16小时和4小时


此表达式还执行当前日期的所有工作。

这将逻辑更改为仅处理当前日期:

SELECT COUNT(CardID) AS CardCOUNT, ReaderTime, controllerID, dtReading
FROM myMachineMonitor2.dbo.ReaderData
WHERE (controllerID = 31) AND
      (CardID = 'fffffff0') AND
      dtReading >= cast(cast(getdate() as date) as datetime) - 16.0/24 and
      dtReading >= cast(cast(getdate() as date) as datetime) - 4.0/24
GROUP BY ReaderTime, controllerID, dtReading ;
对日期的转换将值设置为午夜。然后减去16小时和4小时


此表达式还执行当前日期的所有工作。

这将逻辑更改为仅处理当前日期:

SELECT COUNT(CardID) AS CardCOUNT, ReaderTime, controllerID, dtReading
FROM myMachineMonitor2.dbo.ReaderData
WHERE (controllerID = 31) AND
      (CardID = 'fffffff0') AND
      dtReading >= cast(cast(getdate() as date) as datetime) - 16.0/24 and
      dtReading >= cast(cast(getdate() as date) as datetime) - 4.0/24
GROUP BY ReaderTime, controllerID, dtReading ;
对日期的转换将值设置为午夜。然后减去16小时和4小时


这个表达式也完成了当前日期的所有工作。

我知道有一些关于datetime列的适用性的争论,但我更倾向于这样处理。我发现把这两个条件分开会更容易理解

SELECT COUNT(CardID) AS CardCOUNT
    , ReaderTime
    , controllerID
    , dtReading
FROM myMachineMonitor2.dbo.ReaderData
WHERE controllerID = 31
    AND CardID = 'fffffff0' 
    AND ReaderTime >= dateadd(hour, 8, dateadd(day, datediff(day, 0, CURRENT_TIMESTAMP) - 1, 0)) --8am yesterday
    AND ReaderTime < dateadd(hour, 19, dateadd(day, datediff(day, 0, CURRENT_TIMESTAMP) - 1, 0)) --9pm yesterday
GROUP BY ReaderTime
    , controllerID
    , dtReading;
选择计数(CardID)作为CardCOUNT
,阅读时间
,controllerID
,数据读取
来自myMachineMonitor2.dbo.ReaderData
其中controllerID=31
和CardID='fffffff0'
和ReaderTime>=dateadd(小时,8,dateadd(天,datediff(天,0,当前时间戳)-1,0))--昨天上午8点
而ReaderTime
我知道关于datetime列的可搜索性存在一些争论,但我更倾向于这样处理。我发现把这两个条件分开会更容易理解

SELECT COUNT(CardID) AS CardCOUNT
    , ReaderTime
    , controllerID
    , dtReading
FROM myMachineMonitor2.dbo.ReaderData
WHERE controllerID = 31
    AND CardID = 'fffffff0' 
    AND ReaderTime >= dateadd(hour, 8, dateadd(day, datediff(day, 0, CURRENT_TIMESTAMP) - 1, 0)) --8am yesterday
    AND ReaderTime < dateadd(hour, 19, dateadd(day, datediff(day, 0, CURRENT_TIMESTAMP) - 1, 0)) --9pm yesterday
GROUP BY ReaderTime
    , controllerID
    , dtReading;
选择计数(CardID)作为CardCOUNT
,阅读时间
,controllerID
,数据读取
来自myMachineMonitor2.dbo.ReaderData
其中controllerID=31
和CardID='fffffff0'
和ReaderTime>=dateadd(小时,8,dateadd(天,datediff(天,0,当前时间戳)-1,0))--昨天上午8点
而ReaderTime
我知道关于datetime列的可搜索性存在一些争论,但我更倾向于这样处理。我发现把这两个条件分开会更容易理解

SELECT COUNT(CardID) AS CardCOUNT
    , ReaderTime
    , controllerID
    , dtReading
FROM myMachineMonitor2.dbo.ReaderData
WHERE controllerID = 31
    AND CardID = 'fffffff0' 
    AND ReaderTime >= dateadd(hour, 8, dateadd(day, datediff(day, 0, CURRENT_TIMESTAMP) - 1, 0)) --8am yesterday
    AND ReaderTime < dateadd(hour, 19, dateadd(day, datediff(day, 0, CURRENT_TIMESTAMP) - 1, 0)) --9pm yesterday
GROUP BY ReaderTime
    , controllerID
    , dtReading;
选择计数(CardID)作为CardCOUNT
,阅读时间
,controllerID
,数据读取
来自myMachineMonitor2.dbo.ReaderData
其中controllerID=31
和CardID='fffffff0'
和ReaderTime>=dateadd(小时,8,dateadd(天,datediff(天,0,当前时间戳)-1,0))--昨天上午8点
而ReaderTime
我知道关于datetime列的可搜索性存在一些争论,但我更倾向于这样处理。我发现把这两个条件分开会更容易理解

SELECT COUNT(CardID) AS CardCOUNT
    , ReaderTime
    , controllerID
    , dtReading
FROM myMachineMonitor2.dbo.ReaderData
WHERE controllerID = 31
    AND CardID = 'fffffff0' 
    AND ReaderTime >= dateadd(hour, 8, dateadd(day, datediff(day, 0, CURRENT_TIMESTAMP) - 1, 0)) --8am yesterday
    AND ReaderTime < dateadd(hour, 19, dateadd(day, datediff(day, 0, CURRENT_TIMESTAMP) - 1, 0)) --9pm yesterday
GROUP BY ReaderTime
    , controllerID
    , dtReading;
选择计数(CardID)作为CardCOUNT
,阅读时间
,controllerID
,数据读取
来自myMachineMonitor2.dbo.ReaderData
其中controllerID=31
和CardID='fffffff0'
和ReaderTime>=dateadd(小时,8,dateadd(天,datediff(天,0,当前时间戳)-1,0))--昨天上午8点
而ReaderTime
问题在于,如果将时间作为分组条件,则在不同的时间强制执行一行,而不允许在一定的时间范围内进行聚合。只要把你们小组的时间记录下来,你就没事了

SELECT controllerID, COUNT(CardID) AS CardCOUNT
FROM myMachineMonitor2.dbo.ReaderData
WHERE (controllerID = 31)
  AND (ReaderTime BETWEEN '08:00:00' AND '20:00:00')
  AND (CardID = 'fffffff0')
  AND (DATEDIFF(DAY, DATEADD(DAY, - 1, CURRENT_TIMESTAMP), dtReading) = 0)
GROUP BY controllerID

问题在于,通过将时间作为分组条件,您强制每个不同的时间执行一行,而不允许在一定时间范围内进行聚合。只要把你们小组的时间记录下来,你就没事了

SELECT controllerID, COUNT(CardID) AS CardCOUNT
FROM myMachineMonitor2.dbo.ReaderData
WHERE (controllerID = 31)
  AND (ReaderTime BETWEEN '08:00:00' AND '20:00:00')
  AND (CardID = 'fffffff0')
  AND (DATEDIFF(DAY, DATEADD(DAY, - 1, CURRENT_TIMESTAMP), dtReading) = 0)
GROUP BY controllerID

问题在于,通过将时间作为分组条件,您强制每个不同的时间执行一行,而不允许在一定时间范围内进行聚合。只要把你们小组的时间记录下来,你就没事了

SELECT controllerID, COUNT(CardID) AS CardCOUNT
FROM myMachineMonitor2.dbo.ReaderData
WHERE (controllerID = 31)
  AND (ReaderTime BETWEEN '08:00:00' AND '20:00:00')
  AND (CardID = 'fffffff0')
  AND (DATEDIFF(DAY, DATEADD(DAY, - 1, CURRENT_TIMESTAMP), dtReading) = 0)
GROUP BY controllerID

问题在于,通过将时间作为分组条件,您强制每个不同的时间执行一行,而不允许在一定时间范围内进行聚合。只要把你们小组的时间记录下来,你就没事了

SELECT controllerID, COUNT(CardID) AS CardCOUNT
FROM myMachineMonitor2.dbo.ReaderData
WHERE (controllerID = 31)
  AND (ReaderTime BETWEEN '08:00:00' AND '20:00:00')
  AND (CardID = 'fffffff0')
  AND (DATEDIFF(DAY, DATEADD(DAY, - 1, CURRENT_TIMESTAMP), dtReading) = 0)
GROUP BY controllerID


您应该指定ReaderTime列的类型…您应该指定ReaderTime列的类型…您应该指定ReaderTime列的类型…您应该指定ReaderTime列的类型…但是,
dtReading
上的更改会更改语义。你可能指的是
=
(就在昨天)而不是
=
(从昨天开始的任何事情)。@jcaron。我误解了这个问题,所以修改了答案。@Gordon linoff我刚试过你的问题,它也在做同样的事情,我的问题是在计数中加1,而不是今天的总数,我想要的是昨天上午8点到晚上8点之间,你写的一个从大约1600到昨天now@Oisian2 . . . 我想自从你运行查询后,我修改了它。试试这个版本。@GordonLinoff新版本从昨天的1600运行到现在,我想要的是昨天上午8点到晚上8点之间