SQL Server - 查询返回错误格式

时间:2017-11-21 09:57:01

标签: sql-server

我有一个返回nvarchar格式的查询,我需要timestamp。在数据库中,我有一个具有此数据类型的列,但为了进行比较,我将其格式化为字符串,以便能够将其与时间戳进行比较。

这是我的问题:

SELECT test_run_id, 
       status_timestamp, 
       data_set 
FROM test_runs 
WHERE test_run_id IN (SELECT MAX(test_run_id) AS test_run_id
                      FROM test_runs 
                      WHERE FORMAT(status_timestamp, 'dd-MM-yyyy') = '15-11-2017'
                      GROUP BY data_set)

我认为有两种选择..将status_timestamp转换回时间戳数据类型或不格式化列中的条件和字符串" 15-11-2017"转换为时间戳,以毫秒为单位... to_timestamp对我不起作用

2 个答案:

答案 0 :(得分:0)

我猜 Status_timeStamp 列已经是timestamp / DateTime数据类型,在这种情况下,不需要格式化或时间戳转换。

只需使用,

SELECT test_run_id, status_timestamp, data_set 
FROM test_runs 
WHERE test_run_id IN (SELECT MAX(test_run_id) AS test_run_id
                      FROM test_runs 
                      WHERE status_timestamp = '2017-11-15'
                      GROUP BY data_set)

这应该有效。当您以 yyyy-mm-dd 格式指定日期值时,mysql会自动转换该值。

答案 1 :(得分:0)

您的表可能不包含时间戳列 - https://msdn.microsoft.com/en-us/library/ms182776%28v=SQL.90%29.aspx说“时间戳数据类型只是一个递增的数字,并不保留日期或时间。要记录日期或时间,请使用日期时间数据类型。” - 你可能有一个日期时间,而你称之为时间戳。小心你所谓的东西,特别是如果你所谓的东西不是另一个开发人员称之为那个东西。如有疑问,请在您的问题中发布表格的结构

请勿转换数据,只需使用范围进行检查即可。这样,仍然可以使用列上的任何索引。转换数据通常会阻止使用索引,这很糟糕:

SELECT test_run_id, 
       status_timestamp, 
       data_set 
FROM test_runs 
where test_run_id IN (select max(test_run_id) AS test_run_id
FROM test_runs where status_timestamp >= CONVERT(datetime, '20171115', 112) AND status_timestamp < CONVERT(datetime, '20171116', 112)
GROUP BY data_set)

如果您的日期时间列包含时间和日期,我建议使用范围。

CONVERT(datetime, '20171115', 112)采用yyyymmdd格式的字符串(即112位)并将其转换为日期。我通常更喜欢这样做,而不是依赖于字符串到日期的隐式转换,因为我可以肯定地知道字符串被转换为日期,而不是所有的表日期都被转换为字符串。例如,您可以使用WHERE status_timestamp >= '2017-11-15'的查询,因为SQLserver可能会隐式地将2017-11-15字符串转换为日期..我只是在处理查询时不喜欢“可能”。显式优于隐式