Please start any new threads on our new site at https://forums.sqlteam.com. We've got lots of great SQL Server experts to answer whatever question you can come up with.

 All Forums
 General SQL Server Forums
 New to SQL Server Programming
 Convert sql from Access

Author  Topic 

zyfer9009
Starting Member

7 Posts

Posted - 2012-09-06 : 03:30:50
I have this sql from an Access database I made. Now I have to use it in a .Net app.(VB.net)
Can anyone help me rewrite it.



[code]
SELECT Format(b.PanelDate, [dd/mm-yyyy]) AS dato, format(sum(e.PanelDate - b.PanelDate), [hh:mm:ss]) AS Total, IIf([Total] > [08:00:00], format(DATEADD([hh], - 8, [Total]),
[hh:mm:ss]), [Total] = NULL) AS Overtid, IIf(Weekday([dato], 2) = 6 OR
Weekday([dato], 2) = 7, [Total], NULL) AS Weekend

FROM Eventlog AS b, Eventlog AS e

WHERE (((e.Paneldate) =
(SELECT min(Paneldate)
FROM Eventlog
WHERE ID1Data = 'Læser 2 (6) T-Reg Gået' OR
ID1Data = 'Læser 2 Tinghøj T-Reg Gået' OR
ID1Data = 'Læser 2 Haugaard T-Reg Gået' AND PanelDate > b.PanelDate)) AND ((b.ID1Data) = 'Læser 1 (5) T-Reg Kommet' OR
(b.ID1Data) = 'Læser 1 Tinghøj T-Reg Kommet' OR
(b.ID1Data) = 'Læser 1 Haugaard T-Reg Kommet'))
GROUP BY Format(b.PanelDate, [dd/mm-yyyy]);

[code/]

lionofdezert
Aged Yak Warrior

885 Posts

Posted - 2012-09-06 : 04:48:55
Please provide table structure for Eventlog . Complete columns and their datatype is requried.

--------------------------
http://connectsql.blogspot.com/
Go to Top of Page

zyfer9009
Starting Member

7 Posts

Posted - 2012-09-06 : 05:12:00
quote:
Originally posted by lionofdezert

Please provide table structure for Eventlog . Complete columns and their datatype is requried.

--------------------------
http://connectsql.blogspot.com/



EventLog:

LogId - Primary key - System.Int32
Paneldate - Datetime (registration time) - System.DateTime
PanelData - Terminal (are not used here) - System.String
Id2Data - User ( user that makes the registrantion) - System.String
Id1Data - Type of registration coming or going - System.String

Gået = going
Kommet = coming




Go to Top of Page

lionofdezert
Aged Yak Warrior

885 Posts

Posted - 2012-09-06 : 07:04:28
SELECT CAST(DAY(PanelDate) AS VARCHAR) + '/'
+ CAST(month(PanelDate) AS VARCHAR) + '-'
+ CAST(Year(PanelDate) AS VARCHAR) AS dato,
sum(DATEDIFF(HH, e.PanelDate, b.PanelDate)) AS Total,
CASE WHEN sum(DATEDIFF(HH, e.PanelDate, b.PanelDate)) > 8
THEN sum(DATEDIFF(HH, e.PanelDate, b.PanelDate)) - 8
ELSE NULL
END AS Overtid,
CASE WHEN DATEPART(dw,
CAST(CAST(DAY(PanelDate) AS VARCHAR) + '/'
+ CAST(month(PanelDate) AS VARCHAR) + '-'
+ CAST(Year(PanelDate) AS VARCHAR) AS DATETIME)) IN (
6, 7 ) THEN sum(DATEDIFF(HH, e.PanelDate, b.PanelDate))
ELSE NULL
END AS Weekend
FROM Eventlog AS b,
Eventlog AS e
WHERE ( ( e.Paneldate ) = ( SELECT min(Paneldate)
FROM Eventlog
WHERE ID1Data = 'Læser 2 (6) T-Reg Gået'
OR ID1Data = 'Læser 2 Tinghøj T-Reg Gået'
OR ID1Data = 'Læser 2 Haugaard T-Reg Gået'
AND PanelDate > b.PanelDate )
AND ( ( b.ID1Data ) = 'Læser 1 (5) T-Reg Kommet'
OR ( b.ID1Data ) = 'Læser 1 Tinghøj T-Reg Kommet'
OR ( b.ID1Data ) = 'Læser 1 Haugaard T-Reg Kommet'
)
)
GROUP BY CAST(DAY(PanelDate) AS VARCHAR) + '/'
+ CAST(month(PanelDate) AS VARCHAR) + '-'
+ CAST(Year(PanelDate) AS VARCHAR)

--------------------------
http://connectsql.blogspot.com/
Go to Top of Page

zyfer9009
Starting Member

7 Posts

Posted - 2012-09-06 : 07:45:42
quote:
Originally posted by lionofdezert

SELECT CAST(DAY(PanelDate) AS VARCHAR) + '/'
+ CAST(month(PanelDate) AS VARCHAR) + '-'
+ CAST(Year(PanelDate) AS VARCHAR) AS dato,
sum(DATEDIFF(HH, e.PanelDate, b.PanelDate)) AS Total,
CASE WHEN sum(DATEDIFF(HH, e.PanelDate, b.PanelDate)) > 8
THEN sum(DATEDIFF(HH, e.PanelDate, b.PanelDate)) - 8
ELSE NULL
END AS Overtid,
CASE WHEN DATEPART(dw,
CAST(CAST(DAY(PanelDate) AS VARCHAR) + '/'
+ CAST(month(PanelDate) AS VARCHAR) + '-'
+ CAST(Year(PanelDate) AS VARCHAR) AS DATETIME)) IN (
6, 7 ) THEN sum(DATEDIFF(HH, e.PanelDate, b.PanelDate))
ELSE NULL
END AS Weekend
FROM Eventlog AS b,
Eventlog AS e
WHERE ( ( e.Paneldate ) = ( SELECT min(Paneldate)
FROM Eventlog
WHERE ID1Data = 'Læser 2 (6) T-Reg Gået'
OR ID1Data = 'Læser 2 Tinghøj T-Reg Gået'
OR ID1Data = 'Læser 2 Haugaard T-Reg Gået'
AND PanelDate > b.PanelDate )
AND ( ( b.ID1Data ) = 'Læser 1 (5) T-Reg Kommet'
OR ( b.ID1Data ) = 'Læser 1 Tinghøj T-Reg Kommet'
OR ( b.ID1Data ) = 'Læser 1 Haugaard T-Reg Kommet'
)
)
GROUP BY CAST(DAY(PanelDate) AS VARCHAR) + '/'
+ CAST(month(PanelDate) AS VARCHAR) + '-'
+ CAST(Year(PanelDate) AS VARCHAR)

--------------------------
http://connectsql.blogspot.com/



Thank you so much for the answer

but i get an error " Ambiguous Column name 'PanelDate'"
Go to Top of Page

xloafery
Starting Member

5 Posts

Posted - 2012-09-07 : 02:51:11
replace PanelDate with b.Paneldate to specify which table to get the column from. Ambiguous Column means there's more than one with that name.
Go to Top of Page

zyfer9009
Starting Member

7 Posts

Posted - 2012-09-07 : 03:49:05
quote:
Originally posted by xloafery

replace PanelDate with b.Paneldate to specify which table to get the column from. Ambiguous Column means there's more than one with that name.



Hey. And thanks..:-)

New error now - "The conversion of a varchar data type to a datetime data type resulted in an out-of range value"
Go to Top of Page

Ifor
Aged Yak Warrior

700 Posts

Posted - 2012-09-07 : 12:10:04
You will get better answers if you provide example data and results.

You should really do the formating in your application.

Assuming 2008 or above:

WITH Totals
AS
(
SELECT DATEADD(d, DATEDIFF(d, 0, E.PanelDate), 0) AS dato
,SUM(DATEDIFF(s, E.PanelDate, D.PanelDate)) AS TotalSeconds
FROM Eventlog E
CROSS APPLY
(
SELECT MIN(E1.PanelDate) AS PanelDate
FROM Eventlog E1
WHERE E1.PanelDate > E.PanelDate
AND E1.ID1Data IN
(
'Læser 2 (6) T-Reg Gået'
,'Læser 2 Tinghøj T-Reg Gået'
,'Læser 2 Haugaard T-Reg Gået'
)
) D
WHERE E.ID1Data IN
(
'Læser 1 (5) T-Reg Kommet'
,'Læser 1 Tinghøj T-Reg Kommet'
,'Læser 1 Haugaard T-Reg Kommet'
)
GROUP BY DATEADD(d, DATEDIFF(d, 0, E.PanelDate), 0)
)
,Weekends(WE)
AS
(
SELECT DATEPART(dw,'20120908')
UNION ALL
SELECT DATEPART(dw,'20120909')
)
,Unformated
AS
(
SELECT dato, TotalSeconds
,CASE
WHEN TotalSeconds > (8 * 60 * 60)
THEN TotalSeconds - (8 * 60 * 60)
END AS OvertidSeconds
,CASE
WHEN DATEPART(dw, dato) IN (SELECT WE FROM Weekends)
THEN TotalSeconds
END AS WeekendSeconds
FROM Totals
)
SELECT *
FROM Unformated
--SELECT STUFF(CONVERT(char(10), dato, 103), 6, 1, '-') AS dato
-- ,RIGHT('0' + CAST(TotalSeconds / (60 * 60) AS varchar(2)), 2)
-- + ':'
-- + RIGHT('0' + CAST(TotalSeconds / 60 - (((TotalSeconds / (60 * 60)) * 60) AS varchar(2)), 2)
-- + ':'
-- + RIGHT('0' + CAST(TotalSeconds % 60 AS varchar(2)), 2) AS Total
-- ,RIGHT('0' + CAST(OvertidSeconds / (60 * 60) AS varchar(2)), 2)
-- + ':'
-- + RIGHT('0' + CAST(OvertidSeconds / 60 - (((OvertidSeconds / (60 * 60)) * 60) AS varchar(2)), 2)
-- + ':'
-- + RIGHT('0' + CAST(OvertidSeconds % 60 AS varchar(2)), 2) AS Overtid
-- ,RIGHT('0' + CAST(WeekendSeconds / (60 * 60) AS varchar(2)), 2)
-- + ':'
-- + RIGHT('0' + CAST(WeekendSeconds / 60 - (((WeekendSeconds / (60 * 60)) * 60) AS varchar(2)), 2)
-- + ':'
-- + RIGHT('0' + CAST(WeekendSeconds % 60 AS varchar(2)), 2) AS Weekend
--FROM Unformated


Go to Top of Page

zyfer9009
Starting Member

7 Posts

Posted - 2012-09-11 : 06:22:36
quote:
Originally posted by Ifor

You will get better answers if you provide example data and results.

You should really do the formating in your application.

Assuming 2008 or above:




HELP :-)

This is what I have now....


WITH Totals AS (SELECT DATEADD(d, DATEDIFF(d, 0, E.PanelDate), 0) AS dato, SUM(DATEDIFF(s, E.PanelDate, D .PanelDate)) AS TotalSeconds
FROM Eventlog E CROSS APPLY
(SELECT MIN(E1.PanelDate) AS PanelDate FROM Eventlog E1 WHERE E1.PanelDate > E.PanelDate AND E1.ID1Data IN ('Læser 2 (6) T-Reg Gået', 'Læser 2 Tinghøj T-Reg Gået',
'Læser 2 Haugaard T-Reg Gået')) D
WHERE E.ID1Data IN ('Læser 1 (5) T-Reg Kommet', 'Læser 1 Tinghøj T-Reg Kommet', 'Læser 1 Haugaard T-Reg Kommet') AND ID2Data=@IMP
GROUP BY DATEADD(d, DATEDIFF(d, 0, E.PanelDate), 0)), Weekends(WE) AS
(SELECT DATEPART(dw, '20120908')
UNION ALL
SELECT DATEPART(dw, '20120909')), Unformated AS
(SELECT dato,CASE WHEN DATEPART(dw, dato) IN (SELECT WE FROM Weekends) THEN NULL ELSE (CASE WHEN TotalSeconds>(8*60*60) THEN (8*60*60) ELSE TotalSeconds END) END AS TotalSeconds,
CASE WHEN DATEPART(dw, dato) IN (SELECT WE FROM Weekends) THEN TotalSeconds END AS WeekendSeconds,
CASE WHEN DATEPART(dw, dato) IN (SELECT WE FROM Weekends) THEN NULL ELSE (CASE WHEN TotalSeconds > (8 * 60 * 60) THEN TotalSeconds - (8 * 60 * 60) END) END AS OvertidSeconds
FROM Totals)
SELECT (SELECT CONVERT(VARCHAR(10), Dato, 105) AS [DD/MM/YYYY]) AS Dato,
(SELECT CONVERT(varchar(6), TotalSeconds / 3600) + ':' + RIGHT('0' + CONVERT(varchar(2), (TotalSeconds % 3600) / 60), 2)
+ ':' + RIGHT('0' + CONVERT(varchar(2), TotalSeconds % 60), 2)) AS Total,
(SELECT CONVERT(varchar(6), OvertidSeconds / 3600) + ':' + RIGHT('0' + CONVERT(varchar(2), (OvertidSeconds % 3600) / 60), 2)
+ ':' + RIGHT('0' + CONVERT(varchar(2), OvertidSeconds % 60), 2)) AS Overtid,
(SELECT CONVERT(varchar(6), WeekendSeconds / 3600) + ':' + RIGHT('0' + CONVERT(varchar(2), (WeekendSeconds % 3600) / 60), 2)
+ ':' + RIGHT('0' + CONVERT(varchar(2), WeekendSeconds % 60), 2)) AS Weekend
FROM Unformated
WHERE Dato >= @Start AND Dato < @Slut;


Problem, it calculate wrong .. :-(

@Start = 31-05-2012
@Slut = 01-06-2012
@IMP = Bettina Bentsen

DATA :
PanelDate----------PanelData--------ID2Data------------ID1Data----
31-05-2012 03:58---Terminal3BOX2)---Bettina Bentsen---Læser 1 (5) T-Reg Kommet (Meeting)
31-05-2012 08:59---Terminal3BOX2)---Bettina Bentsen---Læser 2 (6) T-Reg Gået (Going)
31-05-2012 09:28---Terminal3BOX2)---Bettina Bentsen---Læser 1 (5) T-Reg Kommet (Meeting)
31-05-2012 12:52---Terminal3BOX2)---Bettina Bentsen---Læser 2 (6) T-Reg Gået (Going)
31-05-2012 13:16---Terminal3BOX2)---Bettina Bentsen---Læser 1 (5) T-Reg Kommet (Meeting)
31-05-2012 22:51---Terminal3BOX2)---Bettina Bentsen---Læser 2 (6) T-Reg Gået (Going)

TOTAL TIME = 18:00:00
SQL calculates = 9:07:15

HELP :-) ....








Go to Top of Page

Ifor
Aged Yak Warrior

700 Posts

Posted - 2012-09-11 : 11:06:09
[code]
-- *** Test Data ***
CREATE TABLE #EventLog
(
PanelDate datetime NOT NULL
,PanelData nvarchar(50) NOT NULL
,ID2Data nvarchar(50) NOT NULL
,ID1Data nvarchar(50) NOT NULL
);
INSERT INTO #EventLog
SELECT '20120531 03:58', 'Terminal3BOX2', 'Bettina Bentsen', 'Læser 1 (5) T-Reg Kommet'
UNION ALL SELECT '20120531 08:59', 'Terminal3BOX2', 'Bettina Bentsen', 'Læser 2 (6) T-Reg Gået'
UNION ALL SELECT '20120531 09:28', 'Terminal3BOX2', 'Bettina Bentsen', 'Læser 1 (5) T-Reg Kommet'
UNION ALL SELECT '20120531 12:52', 'Terminal3BOX2', 'Bettina Bentsen', 'Læser 2 (6) T-Reg Gået'
UNION ALL SELECT '20120531 13:16', 'Terminal3BOX2', 'Bettina Bentsen', 'Læser 1 (5) T-Reg Kommet'
UNION ALL SELECT '20120531 22:51', 'Terminal3BOX2', 'Bettina Bentsen', 'Læser 2 (6) T-Reg Gået';
-- *** End Test Data ***

WITH Totals
AS
(
SELECT DATEADD(d, DATEDIFF(d, 0, E.PanelDate), 0) AS dato
,SUM(DATEDIFF(s, E.PanelDate, D.PanelDate)) AS TotalSeconds
FROM #Eventlog E
CROSS APPLY
(
SELECT MIN(E1.PanelDate) AS PanelDate
FROM #Eventlog E1
WHERE E1.PanelDate > E.PanelDate
AND E1.ID1Data IN
(
'Læser 2 (6) T-Reg Gået'
,'Læser 2 Tinghøj T-Reg Gået'
,'Læser 2 Haugaard T-Reg Gået'
)
) D
WHERE E.ID1Data IN
(
'Læser 1 (5) T-Reg Kommet'
,'Læser 1 Tinghøj T-Reg Kommet'
,'Læser 1 Haugaard T-Reg Kommet'
)
GROUP BY DATEADD(d, DATEDIFF(d, 0, E.PanelDate), 0)
)
,Weekends(WE)
AS
(
SELECT DATEPART(dw,'20120908')
UNION ALL
SELECT DATEPART(dw,'20120909')
)
,Unformated
AS
(
SELECT dato, TotalSeconds
,CASE
WHEN TotalSeconds > (8 * 60 * 60)
THEN TotalSeconds - (8 * 60 * 60)
END AS OvertidSeconds
,CASE
WHEN DATEPART(dw, dato) IN (SELECT WE FROM Weekends)
THEN TotalSeconds
END AS WeekendSeconds
FROM Totals
)
--SELECT *
--FROM Unformated;
SELECT STUFF(CONVERT(char(10), dato, 103), 6, 1, '-') AS dato
,RIGHT('0' + CAST(TotalSeconds / (60 * 60) AS varchar(2)), 2)
+ ':'
+ RIGHT('0' + CAST(TotalSeconds / 60 - (((TotalSeconds / (60 * 60)) * 60)) AS varchar(2)), 2)
+ ':'
+ RIGHT('0' + CAST(TotalSeconds % 60 AS varchar(2)), 2) AS Total
,RIGHT('0' + CAST(OvertidSeconds / (60 * 60) AS varchar(2)), 2)
+ ':'
+ RIGHT('0' + CAST(OvertidSeconds / 60 - (((OvertidSeconds / (60 * 60)) * 60)) AS varchar(2)), 2)
+ ':'
+ RIGHT('0' + CAST(OvertidSeconds % 60 AS varchar(2)), 2) AS Overtid
,RIGHT('0' + CAST(WeekendSeconds / (60 * 60) AS varchar(2)), 2)
+ ':'
+ RIGHT('0' + CAST(WeekendSeconds / 60 - (((WeekendSeconds / (60 * 60)) * 60)) AS varchar(2)), 2)
+ ':'
+ RIGHT('0' + CAST(WeekendSeconds % 60 AS varchar(2)), 2) AS Weekend
FROM Unformated
WHERE dato >= '20120531'
AND dato < '20120601'
[/code]
Go to Top of Page

zyfer9009
Starting Member

7 Posts

Posted - 2012-09-13 : 07:29:13
quote:
Originally posted by Ifor

[code]
-- *** Test Data ***
CREATE TABLE #EventLog
(
PanelDate datetime NOT NULL
,PanelData nvarchar(50) NOT NULL
,ID2Data nvarchar(50) NOT NULL
,ID1Data nvarchar(50) NOT NULL




Numerous Thanks, It was my variable @ IMP that were teasing.

Just a little thing. How can I count all come and go times, and then compare them.

In the style of this..

"CASE WHEN (COUNT(E.Paneldate)=COUNT(D.PanelDate)) THEN 1 ELSE 0 END AS Tjek"

I need it to see if there is a lack of entries. There should be equal numbers come and go times.


Again, many thanks for your help
Go to Top of Page
   

- Advertisement -