基于特定条件在PHP和MSSQL中检索某些行的最有效方法


Most efficent way to retrieve certain rows in PHP and MS SQL based on specific conditions

我有一个项目正在工作中,我需要了解给定数据和条件下每天的特定时间。我们公司处理项目,并为每一个项目制作日期时间戳,格式为2015-09-16 07:15:18.000。他们还有另一个专栏,在那里他们提到了要处理的星期几。在这种情况下,应该是星期三。该信息以"SU"、"MO"、"TU"、"WE"、"TH"、"FR"、"SA"的形式存储在数据库中。在中午,他们可能会决定把东西标记进来,但停止生产,除非在这个时间之前。这被称为截止。因此,在截止之后标记的任何内容现在都将在列中使用一周中的下一天。因此,如果截止时间是12:35:05,那么2015-09-16 15:04:11:00现在存储为"TH",尽管它是在周三标记的。

从历史上看,他们从未在数据库中保存过截止时间。自2015年1月1日起,现在他们每天都需要计算。因此,我需要能够返回大约313行(我们没有周日的数据),其中一天的最大时间戳与列的日期匹配,并用PHP返回这些结果。但如果有人能在纯transaction SQL中做到这一点,那对我也适用。

我经历了一段艰难的时期,我很感激从这些给定的数据中得到这些结果。

返回结果的示例如下所示:

Date_In                   Week_Day
-----------------------   --------
2015-01-01 12:15:18.000   TH
2015-01-02 12:13:23.000   FR
2015-01-03 12:45:56.000   SA
2015-01-05 12:09:11.000   MO
2015-01-06 11:54:49.000   TU
2015-01-07 12:14:30.000   WE
2015-01-08 12:15:28.000   TH
2015-01-09 12:05:11.000   FR
2015-01-10 12:53:58.000   SA
2015-01-12 12:01:12.000   MO
ect..

开始吧,纯tsql。CCD_ 1与CCD_。

select substring(datename(dw,convert(date,'2015-01-01 12:15:18.000')),0,3) -- returns 'TH'
--get records where date matches weekday
select * from mytable where substring(datename(dw,convert(date,Date_In)),0,3) = Week_Day

这样的东西应该会给你最大日期与工作日匹配的结果

create table #test(
Date_In datetime,
Week_Day varchar(2)
)
insert into #test(Date_In,Week_Day) values ('2015-01-01 12:15:18.000','TH'),
('2015-01-02 12:13:23.000','FR'),
('2015-01-03 12:45:56.000','SA'),
('2015-01-05 12:09:11.000','MO'),
('2015-01-06 11:54:49.000','TU'),
('2015-01-07 12:00:30.000','TU'),
('2015-01-07 12:14:30.000','WE'),
('2015-01-08 12:15:28.000','TH'),
('2015-01-09 12:05:11.000','FR'),
('2015-01-10 12:53:58.000','SA'),
('2015-01-12 12:01:12.000','MO')
   
SELECT Max(Cast(#test.date_in AS DATE)) AS Date_In, 
       Max(#test.week_day)              AS Week_day 
FROM   #test 
       LEFT JOIN #test b 
              ON b.week_day = #test.week_day 
                 AND Cast(b.date_in AS DATE) = Cast(#test.date_in AS DATE) 
WHERE  Substring(Datename(dw, CONVERT(DATE, Cast(#test.date_in AS DATE))), 0, 3) 
       = 
       #test.week_day 
GROUP  BY Cast(#test.date_in AS DATE)

这应该会产生所需的结果。

; WITH T AS (SELECT [Date_In], [Week_Day], ROW_NUMBER() OVER (ORDER BY [Date_In]) RN
    FROM table)
SELECT C1.[Date_In], C1.[Week_Day]
FROM T C1
LEFT JOIN T C2 ON C2.RN -1 = C1.RN
WHERE C1.[Week_Day] <> C2.[Week_Day] OR C1.RN = (SELECT MAX(RN) FROM T)
ORDER BY C1.[Date_In]

这是为每天和每个标记的星期天选择该日期时间的最大值的问题,只要该日期的星期天与标记的日期相同。

SELECT max(date_in), week_day FROM table
WHERE SUBSTRING (datename(dw, date_in), 1, 2) = week_day
GROUP BY Week_Day, CONVERT(date, date_in)

我不能正确地测试它,但这应该有效。也许是语法错误什么的。如果你尝试一下,请告诉我。