Sql-Server

比較具有不同數據類型的兩列的值

  • October 5, 2017

我在表中有兩列需要與數據進行比較。我面臨的問題是每列都有不同的數據類型:floatdatetime2.

EventID EventStartDate
------- ---------------------------
201605  2017-09-21 12:40:29.9800000
201504  2017-09-21 12:40:46.8430000
201606  2017-09-21 12:41:39.3370000
201609  2017-09-21 12:41:57.3100000

現在,我必須將命名列EventID中的值與命名列中的值進行比較EventStartDate;例如,我需要將“201605”中的年份和月份與“2017-09-21 12:40:29.9800000”的年份月份部分進行比較*。*

這是一個範例,說明如何使用CONVERT,REPLACE和的組合SUBSTRING將 DateTime2 列“轉換”為浮點數。

您可以將 DateTime2 列“轉換”為 varchar 數據類型,然後用於SUBSTRING檢索 CCYY-MM 部分,然後用於REPLACE消除日期中的“-”。

我在範例數據中添加了一個額外的行,以便您可以看到比較有效。

SET NOCOUNT ON
Declare @T TABLE (EventID float, EventStartDate Datetime2)
insert into @T VALUES
(201605, '2017-09-21 12:40:29.9800000'),
(201504, '2017-09-21 12:40:46.8430000'),
(201606, '2017-09-21 12:41:39.3370000'),
(201609, '2017-09-21 12:41:57.3100000'),
(201709, '2017-09-21 12:41:57.3100000')

SELECT *
   ,CONVERT(FLOAT, REPLACE(SUBSTRING(CONVERT(VARCHAR(7), EventStartDate), 1, 7), '-', ''))
FROM @T
WHERE EventID = CONVERT(FLOAT, REPLACE(SUBSTRING(CONVERT(VARCHAR(7), EventStartDate), 1, 7), '-', ''))

結果:

| EventID | EventStartDate              | (No column name) |
|---------|-----------------------------|------------------|
| 201709  | 2017-09-21 12:41:57.3100000 | 201709           |

假設您的 EventID 將始終採用以下格式:一年的前 4 位數字和一個月的後 2 位數字:

SELECT * FROM `table` WHERE LEFT(EventID, 4) = YEAR(EventStartDate) AND RIGHT(EventID, 2) = MONTH(EventStartDate);

引用自:https://dba.stackexchange.com/questions/186549