如何用SQL编写计算查询?
使用 SQL Server 2000
我的查询。
SELECT
(Format(IIf(CLng(OutTime) > 180000, CDate('18:00:00'), CDate(Format(OutTime, '00:00:00'))) - IIf(CLng(InTime) < 90000, CDate('09:00:00'), CDate(Format(InTime, '00:00:00'))), 'hh:nn:ss')) As WorkTime,
(Format(IIf(CLng(InTime) < 90000, CDate('09:00:00') - CDate(Format(InTime, '00:00:00')), 0) + IIf(CLng(OutTime) > 180000, CDate(Format(OutTime, '00:00:00')) - CDate('18:00:00'), 0), 'hh:nn:ss')) As OverTime
FROM table
上面的查询是Access查询,我想在sql中编写相同的查询。
健康)状况。
我想计算 090000(HH:MM:SS) 之后 180000 进入工作时间之前的时间 180000后090000进入加时赛。
数据库中的 Intime、Outtime 数据类型为 varchar
我是 SQL Server 2000 的新手
如何从上面相同的内容编写 SQL 查询?
Using SQL Server 2000
My Query.
SELECT
(Format(IIf(CLng(OutTime) > 180000, CDate('18:00:00'), CDate(Format(OutTime, '00:00:00'))) - IIf(CLng(InTime) < 90000, CDate('09:00:00'), CDate(Format(InTime, '00:00:00'))), 'hh:nn:ss')) As WorkTime,
(Format(IIf(CLng(InTime) < 90000, CDate('09:00:00') - CDate(Format(InTime, '00:00:00')), 0) + IIf(CLng(OutTime) > 180000, CDate(Format(OutTime, '00:00:00')) - CDate('18:00:00'), 0), 'hh:nn:ss')) As OverTime
FROM table
Above query is Access Query, I want to write a same query in sql.
Condition.
I want to Calculate the time after 090000(HH:MM:SS) before 180000 comes in worktime, before
090000 after 180000 comes in overtime.
Intime, Outime data type is varchar in the database
Am new to SQL Server 2000
How to write a SQL query from the above same?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
下面是 SQL Server 2000 的代码。2005+ 可以使用交叉连接在没有子查询的情况下完成此操作。
如果您的 inTime 和 outTime 列也有日期部分,则查询略有不同:
Here is code for SQL server 2000. 2005+ could do it without subquery using cross join.
If Your inTime and outTime columns hase date part too, the query is slightly different:
我错过了 inTime 和 outTime 的类型。
这是 varchar 的版本
错过了,但你只需要做 Cast(inTime as datetime) 。
使用前 2 个查询中的第一个:
I missed type of inTime and outTime.
Here is the version for varchar
Missed that, but you just have to do Cast(inTime as datetime) .
Use the first of previous 2 queries:
这里是对 TSQL 2000 的查询的字面翻译。
不过,可以重写以获得更好的性能:
稍后添加:
如果 InTime 和 OutTime 只有时间部分(日期部分是 1900 年 1 月 1 日),则可以直接使用 InTime 和 OutTime。否则,您必须从日期时间列中提取时间部分,如下所示:(
这是仅获取时间部分的最快方法)
而不是:
您可以使用
P.S.因为您的时间存储为字符串,所以您不需要仅获取时间部分。您可以将它们转换为日期时间,或者您也可以编写
Here is literally translated query to TSQL 2000.
Although, it could be rewritten for better performance:
Added later:
If InTime and OutTime have time part only (Date part is Jan 1 1900) you can use directly InTime and OutTime. Otherwise you have to extract time part from datetime column, as:
(this is the fastest way to get time part only)
Instead of:
You can use
P.S. as your time is stored as string yoiu don't need to get time part only. You can cast them to datetime, or you can write also
作为初学者,请查看此网站,它向您展示了如何将 Access SQL 语句转换为 SQL Server 使用的 T-SQL。
http://weblogs.sqlteam.com/jeffs/archive/2007/03/30/Quick-Access-JET-SQL-to-T-SQL-Cheatsheet.aspx
As a starter take a look at this website which shows you how to convert Access SQL statements into T-SQL as used by SQL server.
http://weblogs.sqlteam.com/jeffs/archive/2007/03/30/Quick-Access-JET-SQL-to-T-SQL-Cheatsheet.aspx
我认为没有一种非常容易和简单的方法来做到这一点 - 最明显的是因为在 VARCHAR 中存储时间值 - 这确实使这变得棘手......
无论如何,我使用了一种具有两个函数的方法 - 一个
dbo.GetSeconds
将时间值的字符串表示形式('103500' -> 10:35:00 小时)转换为秒数,然后转换为第二个dbo.GetOvertime 检测是否有超时。
有了这两个函数,我就可以相当轻松地计算出您要查找的内容:
这有点复杂 - 正如我所说,如果您使用 SQL Server 2008 并使用 TIME 数据类型,事情就会变得容易多了!
马克
I don't think there's a very easy and simple way to do this - most notably because of storing time values in VARCHAR - this is really making this tricky.....
Anyway, I used an approach with two functions - one
dbo.GetSeconds
that converts a string representation of a time value ('103500' -> 10:35:00 hours) to a number of seconds, and then a second onedbo.GetOvertime
that detects if there is any overtime.With those two functions in place, I can fairly easily calculate what you're looking for:
It's a bit involved - as I said, if you'd be on SQL Server 2008 and using the
TIME
data type, things would be a whole lot easier!Marc
您可以使用 substring 和 dateadd 将“090000”转换为真正的日期时间字段。然后你可以使用CASE和DATEDIFF来分割工作和加班。最终的格式可以通过 CONVERT 完成。这是一个例子:
这将打印:
You could use substring and dateadd to convert the '090000' to a real datetime field. Then you can use CASE and DATEDIFF to split work and overtime. The final formatting can be done with CONVERT. Here's an example:
This will print: