我正在将查询从Oracle迁移到sql server。该查询包含一些日期计算。它以小时计算总工时:mi格式。你可以帮我转换它,因为Datediff不包含HH:Mi格式而且我是新的在SQL服务器,所以我不知道如何在Mssql.Except中工作该查询的Mod,以下查询中的所有函数,我在mssql中创建。
SELECT dbo.TRIM(dbo.TO_CHAR(dbo.TRUNC(MOD((dbo.TO_DATE (MAX (END_HOUR),'HH24.MI') -
dbo.TO_DATE (MIN (START_HOUR),'HH24.MI'))* 24,24)),'00')) + ':'
+ dbo.TRIM(dbo.TO_CHAR(dbo.TRUNC(MOD((dbo.TO_DATE(MAX(END_HOUR),'HH24.MI') -
dbo.TO_DATE(MIN (START_HOUR),'HH24.MI'))* 24* 60,60)),'00')) TOTAL_TIME FROM MY_TABLE
WHERE ID_PERSON in( 307,294,291,290,292,293) AND DS_DATE BETWEEN
dbo.TO_DATE ('01.03.2011', 'dd.mm.yyyy') AND dbo.TO_DATE('03.05.2011', 'dd.mm.yyyy')
答案 0 :(得分:0)
这绝对不是一个关于港口的简报。因此,如果我不得不这样做,我可以首先将其中的声明分开:
dbo.TRIM(dbo.TO_CHAR(dbo.TRUNC(MOD((dbo.TO_DATE (MAX (END_HOUR),'HH24.MI') - dbo.TO_DATE (MIN (START_HOUR),'HH24.MI'))* 24,24)),'00'))
和
dbo.TRIM(dbo.TO_CHAR(dbo.TRUNC(MOD((dbo.TO_DATE(MAX(END_HOUR),'HH24.MI') - dbo.TO_DATE(MIN (START_HOUR),'HH24.MI'))* 24* 60,60)),'00'))
然后尝试将每个细分为更小的部分。
可以使用TSql TO_CHAR
和TO_DATE
convert(### as datetime)
和cast(### as varchar)
TRIM
,TRUNC
,MOD
,MIN
和MAX
您应该能够在TSql中找到等价物。
找到Transact-SQL引用here。
答案 1 :(得分:0)
当我尝试将Oracle查询迁移到sql时,我遇到了与HH:MI
格式相同的问题。我找到了以下解决方法:
CAST(CAST(getdate() as time(0)) as varchar(5)) "Time inn HHMI format"
答案 2 :(得分:0)
如果我理解正确,您希望获得员工在此期间工作的总时间。 如果你有开始日期时间和结束日期时间的记录,你可以在datetime-datatype上使用数学。
如果您想获得一天的工作时间,请执行以下操作:
select time1, time2, convert (varchar(8),time2-time1,108) from timecalc
datetime数据类型是一个数字,盯着1.1.1900。因此,如果datetime-values相差6小时,则会得到1900-01-01 06:00:00.000。
您可以将其转换为varchar以使用它并获得小时和分钟,例如我发布的06:00:00示例。
要使用分钟和秒,请使用:
dateadd()
Convert(type, value, format)
型:
Convert(Varchar(8),date, 108)
有关格式的详细信息: http://msdn.microsoft.com/en-us/library/aa226054(v=sql.80).aspx