2016-01-06 71 views
0

我有一個sql查詢,我需要刪除特定的行,基於查詢中生成的varchar中的倒數第三個數字。該查詢以格式「yyyy-MM-dd hh:mm:ss」採用小日期時間並將其轉換爲varchar。例如:日期「2015-05-04 06:03:00」將成爲varchar 05040603.我需要刪除第三個到最後一個varchar數字是9,1,4或0的任何行項目。以下是我的當前代碼:基於字符串中的字符從查詢中刪除行項目sql

SELECT DISTINCT 
    RIGHT('0' + CAST(DATEPART(M, TableA.DateTime) AS varchar), 2) 
    + RIGHT ('0' + Cast(DATEPART(DD, TableA.DateTime) AS varchar), 2) 
    + RIGHT('0' + CAST(DATEPART(HH, TableA.DateTime) AS varchar), 2) 
    + RIGHT('0' + CAST(DATEPART(MINUTE, TableA.DateTime) AS varchar), 2) AS 'VarChar Number', 
    ColA, DateTime 
FROM 
    TableA 
WHERE 
    ColB IS NOT NULL 
    AND DateTime NOT IN (SELECT DateTime From TableB) 
    AND DateTime NOT IN (SELECT DateTime From tableC 
         WHERE DateTime IS NOT NULL) 

在這個例子中的表A具有我的小日期時間和正在從它產生的varchar數。 ColA來自表A並且僅僅是信息。 Where語句只是將日期時間與其他表進行比較,以便根據日期是否已經出現在這些表中來將其刪除。

+0

您正在使用哪種類型的SQL?微軟,Oracle,PostgreSQL,MySQL? –

+0

Microsoft,特別是SQL Server Management Studio。但是,我將把代碼放入vb.net程序並使用它填充datagridview。 – Cheddar

回答

1
SELECT DISTINCT 
    RIGHT('0' + CAST(DATEPART(M, TableA.DateTime) AS varchar), 2) + 
    RIGHT ('0' + Cast(DATEPART(DD, TableA.DateTime) AS varchar), 2) + 
    RIGHT('0' + CAST(DATEPART(HH, TableA.DateTime) AS varchar), 2) + 
    RIGHT('0' + CAST(DATEPART(MINUTE, TableA.DateTime) AS varchar), 2) AS 'VarChar Number', 
    ColA, 
    DateTime 
FROM 
    TableA 
WHERE 
    ColB IS NOT NULL AND 
    DateTime NOT IN (SELECT DateTime From TableB) AND 
    DateTime NOT IN (SELECT DateTime From tableC WHERE DateTime IS NOT NULL) AND 
    RIGHT(CAST(DATEPART(HH, TableA.DateTime) AS varchar), 1) NOT IN ('0', '1', '4', '9') 
+0

這工作,謝謝。 – Cheddar

2

您可以使用substring來執行此操作。

select * from 
(
SELECT DISTINCT 
RIGHT('0' + CAST(DATEPART(M, TableA.DateTime) AS varchar), 2) 
+ RIGHT ('0' + Cast(DATEPART(DD, TableA.DateTime) AS varchar), 2) 
+ RIGHT('0' + CAST(DATEPART(HH, TableA.DateTime) AS varchar), 2) 
+ RIGHT('0' + CAST(DATEPART(MINUTE, TableA.DateTime) AS varchar), 2) AS [VarChar Number], 
ColA, DateTime FROM TableA WHERE ColB IS NOT NULL 
AND DateTime NOT IN (SELECT DateTime From TableB) 
AND DateTime NOT IN (SELECT DateTime From tableC WHERE DateTime IS NOT NULL) 
) t 
where substring([VarChar Number], 6, 1) not in ('0','1','4','9') 
+0

這可以工作,但我寧願選擇從原始日期時間列與生成的列。謝謝! – Cheddar

+0

@vkp我認爲你需要第八個字符而不是第六個。我也必須仔細閱讀,但'varchar'版本不包括秒。 – shawnt00

0
... 
WHERE 
    ColB IS NOT NULL 
    AND DateTime NOT IN (SELECT DateTime From TableB) 
    AND DateTime NOT IN (SELECT DateTime From tableC 
         WHERE DateTime IS NOT NULL) 
    and datepart(minute, TableA.DateTime) % 10 not in (0, 1, 4, 9) 

我不認爲有任何理由與字符串值勾搭,只是提取分鐘,並與工作。理解意圖並避免問題更爲清楚,就像vkp的答案一樣,意外地看着第6個位置而不是第8個位置。