Php SQL语句不完全符合我的要求
我目前正在SQLServerManagementStudio中编写一个SQL查询,该查询将在PHP中使用 该查询的目的是获取昨天上午8点到晚上8点之间的所有记录,并计算有多少记录具有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
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点之间