Хотя я не уверен на 100%, что делают pandas или python. Я видел это раньше, и для нас это было из-за того, что эпоха пыталась преобразовать в метки времени. Когда эти данные передаются, создается впечатление, что они преобразуются в эпоху, а затем CAST
( :: TIMESTAMP_NTZ ) в TIMESTAMP_NTZ, который по какой-то причине дает шкалу 0 вместо 9.
Я рекомендую использовать функцию для CONVERT
( [TRY_] TO_TIMSTAMP (<значение>, [масштаб / формат] )) значения в метке времени. Это даст вам возможность указать функция, в какой тип данных передается и как она должна интерпретировать эти данные. С CAST вы оставляете решать Snowflake.
Вот пример кода, который, надеюсь, поможет визуализировать ситуацию. использовал ваши примеры отметок времени, которые изначально были построены в виде строки. Затем я преобразовал (и преобразовал для полноты) в отметку времени, затем в миллисекунды, затем использовал миллисекунды, чтобы вернуться к отметке времени.
SELECT $1 AS C1
,$2 AS C2
// strings cast or converted to timestamps both result in the same output, so we can use either to calculate the MS from EPOCH start
,$2::TIMESTAMP_NTZ AS STRING_CAST_TO_DTTM
,TO_TIMESTAMP_NTZ($2) AS STRING_CONVERT_TO_DTTM
,DATEDIFF('MS','0',STRING_CAST_TO_DTTM) AS MS
// ,DATEDIFF('MS','0',STRING_CONVERT_TO_DTTM) AS MS
// the lines below are integers being CONVERTED to timestamp and the scale is an explicit parameter of the function; note that everything converts correctly BASED ON SCALE
,TO_TIMESTAMP_NTZ(MS,0) AS CONVERT_NTZ0
,TO_TIMESTAMP_NTZ(MS,3) AS CONVERT_NTZ3
,TO_TIMESTAMP_NTZ(MS,6) AS CONVERT_NTZ6
,TO_TIMESTAMP_NTZ(MS,9) AS CONVERT_NTZ9
// the lines below are integers being CAST to timestamp; note that the scale does not matter everything is returned as TIMESTAMP_NTZ(0)
,MS::TIMESTAMP_NTZ(0) AS CAST_NTZ0
,MS::TIMESTAMP_NTZ(3) AS CAST_NTZ3
,MS::TIMESTAMP_NTZ(6) AS CAST_NTZ6
,MS::TIMESTAMP_NTZ(9) AS CAST_NTZ9
FROM VALUES
(1,'2020-02-02 00:35:28.000')
,(2,'2020-02-02 00:35:31.857')
,(3,'2020-02-02 00:35:21.000')
;
// use this to see the resulting data types for each column
DESC RESULT LAST_QUERY_ID();
Комментарий, если У вас есть вопросы по поводу приведенного выше кода.