Sql-Server
比較具有不同數據類型的兩列的值
我在表中有兩列需要與數據進行比較。我面臨的問題是每列都有不同的數據類型:
float
和datetime2
.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);