타임스탬프/날짜/시간/날짜 데이터가 포함된 MS SQL 쿼리여러분, 안녕하세요,
데이터 테이블을 데이터베이스에 저장하고 나중에 MS SQL을 사용하여 데이터베이스를 쿼리하여 테이블을 검색하려고 합니다. 타임스탬프를 데이터베이스로 전송하는 데 몇 가지 문제가 발생하므로 해결 방법을 설정했습니다. 우선, JMP의 테이블에는 "SecondsSince1904"라는 "날짜" 열이 있습니다. 여기서 날짜/시간은 1904년 에포체(01.01.1904 00:00:00) 이후 경과된 초로 저장됩니다. 이 열의 형식은 "고정 12월(30,0)"입니다. 데이터 테이블을 데이터베이스로 전송하기 위해 다음 스크립트를 사용합니다.
Names Default To Here(1);
dt = Current Data Table();
// This will delete the table "yourTable" in the database. BE CAREFUL!!!
Open Database(
"yourDSNconnectionString",
"DROP TABLE dbo.yourTable"
);
// This will upload the table "dt = Current Data Table" to the database, where it will be saved as "yourTable".
dt << Save Database("yourDSNconnectionString",
"dbo.yourTable"
);
// After saving the table to the database, we find the column "SecondsSince1904" formatted as FLOAT.
// Now we want to manipulate the table "yourTable" and add a computed column named "timestamp", where we will display the correct timestamp,
// i. e. something like "2015-09-26 00:00:02.000".
// We do this by calculating the correct timestamp from the column "SecondsSince1904". We also add an additional column named "SecondsAfterMidnight" just for fun.
dbc = Create Database Connection(
"yourDSNconnectionString"
);
Execute SQL(dbc,
"
ALTER TABLE dbo.yourTable ADD timestamp AS
DATEADD(ss, (CAST(yourTable.SecondsSince1904 AS BIGINT)%86400),
DATEADD(dd, (CAST(yourTable.SecondsSince1904 AS BIGINT)/86400), '1904-01-01' ) );
ALTER TABLE dbo.yourTable ADD SecondsAfterMidnight AS
(CAST(yourTable.SecondsSince1904 AS BIGINT)%86400)
"
);
Close Database Connection(dbc);
여태까지는 그런대로 잘됐다. 현재까지는 문제가 없습니다. "SecondsAfter1904"가 데이터베이스로 올바르게 전송되고 타임스탬프도 올바르게 계산됩니다. 데이터베이스를 살펴보십시오.

이제 파일 > 데이터베이스 > 테이블 열기로 이동하여 데이터베이스를 쿼리하고 테이블을 다시 JMP로 검색합니다. 그리고 이것이 일이 엉망이 되는 지점입니다. JMP를 살펴보세요.

타임스탬프가 손상되었습니다. 일부 오류가 발생했습니다. 아마 비트시프트나 그와 비슷한 것일 겁니다. 결론을 도출하기 위해 SecondsSince1904 "비트 단위"를 증가시켰습니다.
여기서 무슨 일이 일어났는지 아는 사람 있나요? 이것은 버그인가요? 도움을 주시면 감사하겠습니다.
건배,
승리자
Re: 타임스탬프/날짜/시간/날짜 데이터가 포함된 MS SQL 쿼리<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />고마워요 msharp. TRUNCATE 명령을 사용하고 기존 테이블에 INSERT INTO를 사용하여 제안을 시도해 보겠습니다. 하지만 현재 JMP의 어떤 데이터 테이블에서 데이터를 가져와야 하는지 올바르게 지정하는 방법을 모르겠습니다. 어쩌면 당신의 도움이 되는 기여가 이 스레드 나를 해결책으로 이끌 것입니다 ...
그러나 아래 설명된 대로 데이터베이스의 datetime2(0)을 사용하여 원래 문제를 해결할 수 있었습니다.
Re: 타임스탬프/날짜/시간/날짜 데이터가 포함된 MS SQL 쿼리그래서 마침내 쿼리가 시작될 때 데이터베이스 내에서 변환 문제가 있음이 밝혀졌습니다. 나는 이것을 설명하려고 노력합니다 :
일부 타임스탬프가 데이터베이스에 "datetime" 형식으로 저장되어 있다고 가정해 보겠습니다. 그런 다음 쿼리를 실행하면 위의 예와 같이 전송 시 타임스탬프에 오류가 발생합니다. 타임스탬프가 기본적으로 "datetime2(7)"인 "datetime2" 형식으로 저장되는 경우에도 동일한 현상이 발생합니다.
그러나 데이터베이스의 열을 "datetime2(7)"에서 "smalldatetime"으로 캐스팅하면 나는 같은 오류가 발생합니다. 따라서 문제는 JMP 내부가 아니라 데이터베이스 내부에 있는 것으로 추측됩니다. 제 생각에는 JMP가 다운로드하기 전에 타임스탬프가 있는 열에 일부 CAST 또는 CONVERT 명령을 보내는 것 같습니다. 그리고 지금이 문제가 발생하는 순간이라고 생각합니다.
이 문제를 극복하기 위해 타임스탬프가 있는 열을 " 날짜시간2(0) " 형식입니다. 이는 JMP가 올바르게 읽는 형식입니다.
전체 코드는 다음과 같습니다.
Names Default To Here(1);
dt = Current Data Table();
dt << Save Database("yourDSNconnectionString",
"dbo.yourTable"
);
dbc = Create Database Connection(
"yourDSNconnectionString"
);
Execute SQL(dbc, // Here we calculate the correct timestamp/date from the Macintosh or JMP epoche (01.01.1904 00:00:00)
"
ALTER TABLE dbo.yourTable ADD timestamp AS
DATEADD(ss, (CAST(yourTable.SecondsSince1904 AS BIGINT)%86400),
DATEADD(dd, (CAST(yourTable.SecondsSince1904 AS BIGINT)/86400), '1904-01-01 00:00:00' ) );
"
);
Execute SQL(dbc,
"
ALTER TABLE dbo.yourTable ADD Date datetime2(0);
"
);
Execute SQL(dbc,
"
UPDATE dbo.yourTable
SET Date = CONVERT(datetime2(0), timestamp);
"
);
Execute SQL(dbc,
"
ALTER TABLE dbo.yourTable DROP COLUMN timestamp, SecondsSince1904
"
);
Close Database Connection(dbc);
아마도 이것은 누군가에게 도움이 될 것입니다.
Re: 타임스탬프/날짜/시간/날짜 데이터가 포함된 MS SQL 쿼리당신은 이해를 놓치고 있습니다.데이터베이스에 날짜를 DateTime 형식으로 저장합니다.PMroz가 제안하는 것은 모든 것을 다른 플랫폼으로 보내기 전에 날짜 문자열로 변환하는 것입니다.이는 다양한 시대를 다룰 때 유용한 팁입니다.
데이터 테이블을 삭제하면서 JMP에서 SQL Server로 이동하는 데 문제가 있습니다."TRUNCATE TABLE table_name"으로 삭제하면 됩니다.JMP에는 날짜/시간 열이 없으며 날짜/시간 형식의 숫자 열만 있습니다.따라서 << 데이터베이스 저장을 사용하면 JMP는 시간을 인식하지 못하기 때문에 숫자 열만 생성합니다.그러나 날짜/시간 형식의 열이 있는 SQL 테이블이 이미 있고 여기에 삽입된 경우에는 문제가 없습니다.
Re: 타임스탬프/날짜/시간/날짜 데이터가 포함된 MS SQL 쿼리추측이긴 하지만 나는 당신이 맞다고 생각합니다. 매초마다 1000초가 추가되는 것 같습니다. 또한 재설정은 23초에서 123초 사이에서 발생합니다. 문제는 SQL의 날짜/시간 형식에 밀리초, 마이크로초, 나노초(dd.mm.yyyy hh:mm:ss.mmmmmmn)가 포함되어 있다는 것입니다. 계속해서 추측해 보면, 데이터베이스에서 JMP로 가져올 때 JMP는 1000밀리초를 1초가 아닌 1000초로 간주할 수도 있습니다.
몇 가지 형식과 스타일을 사용해 보았지만 JMP에게 데이터베이스에서 테이블을 올바르게 가져오는 방법을 가르칠 수 없었습니다. 다음은 데이터베이스의 타임스탬프 형식이 JMP와 동일함을 보장하는 최신 코드입니다. 형식은 "smalldatetime"이며 "dd.mm.yyyy hh:mm:ss"와 같습니다.
...
SQL(dbc,
"
ALTER TABLE dbo.berstTry01 ADD 타임스탬프 AS
DATEADD(ss, (CAST(berstTry01.SecondsSince1904 AS BIGINT)%86400), CAST(
DATEADD(dd, (CAST(berstTry01.SecondsSince1904 AS BIGINT)/86400), '1904-01-01 00:00:00' ) AS smalldatetime) ) ;
ALTER TABLE dbo.berstTry01 ADD SecondsAfterMidnight AS
(CAST(berstTry01.SecondsSince1904 AS BIGINT)%86400);
"
);
...
불행히도 이것도 작동하지 않았습니다. 그리고 지금 당장은 그것이 작동하도록 하기 위해 무엇을 해야 할지 더 이상 알 수 없습니다.
데이터베이스에 적용된 공식은 실제로 JMP와 전혀 상호 작용하지 않습니다. 그리고 첫 번째 그림에서 추론할 수 있듯이 계산은 분명히 정확합니다. 무슨 일이 일어나고 있는지는 INTEGER가 데이터베이스로 전송되고 INTEGER의 값이 "JMP 에포크" 이후 경과된 초(1904년 이후의 초)가 된다는 것입니다.
예제를 실행하면 날짜는 정확하지만 시간이 잘못 표시됩니다(14:14:14 대신 18:07:17)...
이 문제를 더 많이 조사할수록 이것이 실제로 버그라는 느낌이 더 많이 듭니다. 저는 JMP 12.2.0을 실행하고 있습니다.
Re: 타임스탬프/날짜/시간/날짜 데이터가 포함된 MS SQL 쿼리글쎄, 당신이 제안한 대로 수행하는 것(데이터베이스에 날짜를 문자열로 갖는 것)은 제가 고려한 옵션 중 하나였습니다. 하지만 데이터베이스의 날짜를 날짜/시간 형식으로 저장하는 것이 편리할 것이라고 생각했습니다. 그러나 JMP 테이블을 데이터베이스에 저장하면 날짜는 char 형식의 문자열로 저장됩니다. 따라서 날짜/시간에서 문자로 변환할 필요가 없으며 날짜가 기본적으로 데이터베이스의 날짜/시간 형식으로 저장되지 않는 이유를 모르겠습니다. 그래서 위의 스크립트를 작성했습니다 ...
나는 또한 귀하의 솔루션으로 끝날 것이라고 생각합니다. 즉, 데이터베이스의 날짜를 char 형식의 문자열로 갖는 것입니다. 하지만 그것은 나에게 조금 실망스럽습니다.
Re: 타임스탬프/날짜/시간/날짜 데이터가 포함된 MS SQL 쿼리이것은 추측이지만 1초마다 1000초가 추가되는 것처럼 보입니다.그런 다음 86.4초 후에 0으로 재설정됩니다.수식을 가져올 때 JMP와 상호 작용하는 방식에 문제가 있는 것 같습니다.
SQL에 삽입할 때 JMP 시대를 사용하고 있습니까?SQL은 1-1-1900입니다. SQL에 올바르게 삽입하는 데 문제가 있는 이유일 수 있습니다.
차이 = 숫자 ( "1-1-1904" ) - 숫자 ( "1-1-1900" );
시간 = ( 숫자 ( "1914년 7월 14일 14:14:14" ) + 차이점)/ 86400 ;
//SQL에서
DB = 데이터베이스 연결 생성 ( "드라이버=SQL SERVER;서버=BLAH\SQLEXPRESS;데이터베이스=Test_DB" );
SQL 실행 (디비,
"캐스트 선택(" || 숯 (시간)|| " AS DATETIME) AS '타임스탬프'"
);
데이터베이스 연결 닫기 (db);
이것은 나에게 적합한 값을 반환합니다.
Re: 타임스탬프/날짜/시간/날짜 데이터가 포함된 MS SQL 쿼리데이터베이스에서 읽을 때 날짜/날짜/시간에 대해 약간 다른 접근 방식을 취합니다.이를 문자열로 변환한 다음 JMP를 사용하면 다시 날짜 또는 날짜/시간으로 변환합니다.그래야 그것이 옳을 것이라는 것을 알 수 있습니다.나는 사용하고있다 to_char 오라클에서.SQL Server가 사용하는 것을 확인했습니다. 전환하다 또는 깁스 비슷한 일을 하려고요.JMP에는 문자열 날짜를 JMP 날짜로 변환하는 함수가 있습니다.
다른 방향으로(JMP에서 SQL Server로) 왜 그런 문제가 발생하는지 잘 모르겠습니다.SQL Server의 기본 날짜 형식을 조사해 볼 가치가 있나요?