我有一个返回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
对我不起作用
答案 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
字符串转换为日期..我只是在处理查询时不喜欢“可能”。显式优于隐式