Как мне конвертировать это из TSQL в MYSQL? - PullRequest
1 голос
/ 07 июля 2011

Я пытаюсь настроить таблицу поиска даты, как показано ниже: http://www.techrepublic.com/blog/datacenter/simplify-sql-server-2005-queries-with-a-dates-table/326, но автор использует tsql, а не mysql.

Я создал таблицу, но теперь я пытаюсь ее заполнить. У автора есть это:

Создать синтаксис таблицы:

CREATE TABLE DateLookup
 (
     DateKey INT PRIMARY KEY,
     DateFull DATETIME,
     CharacterDate VARCHAR(10),
     FullYear CHAR(4),
     QuarterNumber TINYINT,
     WeekNumber TINYINT,
     WeekDayName VARCHAR(10),
     MonthDay TINYINT,
     MonthName VARCHAR(12),
     YearDay SMALLINT,
     DateDefinition VARCHAR(30),
     WeekDay TINYINT,
     MonthNumber TINYINT
 )






DECLARE @Date DATETIME
 SET @Date = '1/1/1900'     

 WHILE @Date < '1/1/2100'
 BEGIN
     INSERT INTO DateLookup
     (
         DateKey, DateFull, FullYear,
         QuarterNumber, WeekNumber, WeekDayName,
         MonthDay, MonthName, YearDay,
         DateDefinition,
                CharacterDate,
                WeekDay,
                MonthNumber
     )
     SELECT
         CONVERT(VARCHAR(8), @Date, 112), @Date, YEAR(@Date),
         DATEPART(qq, @Date), DATEPART(ww, @Date), DATENAME(dw, @Date),
         DATEPART(dd, @Date), DATENAME(mm, @Date), DATEPART(dy,@Date),
               DATENAME(mm, @Date) + ' ' + CAST(DATEPART(dd, @Date) AS CHAR(2)) + ',   
           ' + CAST(DATEPART(yy, @Date) AS CHAR(4)),
           CONVERT(VARCHAR(10), @Date, 101),
           DATEPART(dw, @Date),
           DATEPART(mm, @Date)

     SET @Date = DATEADD(dd, 1, @Date)
 END

Я удалил все знаки @, и похоже, что дата может не понравиться как имя переменной, но не удалось ее запустить.

BEGIN
  DECLARE dateInsert DATETIME
     SET dateInsert = "1900-01-01"
     WHILE dateInsert < "2100-01-01" DO

         INSERT INTO DateLookup
         (
             DateKey, DateFull, FullYear,
             QuarterNumber, WeekNumber, WeekDayName,
             MonthDay, MonthName, YearDay,
             DateDefinition,
                    CharacterDate,
                    WeekDay,
                    MonthNumber
         )
         SELECT
             CONVERT(VARCHAR(8), dateInsert, 112), dateInsert, YEAR(@dateInsert),
             DATEPART(qq, dateInsert), DATEPART(ww, dateInsert), DATENAME(dw, dateInsert),
             DATEPART(dd, dateInsert), DATENAME(mm, dateInsert), DATEPART(dy,dateInsert),
                   DATENAME(mm, dateInsert) + ' ' + CAST(DATEPART(dd, dateInsert) AS CHAR(2)) + ',   
               ' + CAST(DATEPART(yy, dateInsert) AS CHAR(4)),
               CONVERT(VARCHAR(10), dateInsert, 101),
               DATEPART(dw, dateInsert),
               DATEPART(mm, dateInsert)

         SET dateInsert = DATEADD(dd, 1, dateInsert)
     END WHILE;
END;

РЕДАКТИРОВАТЬ: Я попробовал это приложение: http://sourceforge.net/projects/tsql2mysql/, но, похоже, оно не работает ни на одной из моих машин.

РЕДАКТИРОВАТЬ: Это не удается рядом 'ОБЪЯВИТЬ dateInsert DATETIME SET dateInsert = '1900-01-01' В ТО ВРЕМЯ КАК' с или без знака @, с или без даты, переименованной в dateInsert.

Я попытался удалить оператор 'set dateInsert =' и заменить его добавлением default = "1900-01-01" в конце объявления, но это не получится.

Я пробовал одинарные и двойные кавычки, которые, похоже, не имели значения.

Ответы [ 2 ]

1 голос
/ 07 июля 2011

Из документации: DECLARE is permitted only inside a BEGIN ... END compound statement and must be at its start, before any other statements.

Обновление

Вот что-то ближе. Вам нужно разобраться в синтаксисе CONVERT, который отличается в MySQL.

DELIMITER $$
CREATE PROCEDURE test()
BEGIN
    DECLARE dateInsert DATETIME;
     SET dateInsert = '1900-01-01';
     WHILE dateInsert < '2100-01-01' DO
        BEGIN
             INSERT INTO DateLookup
             (
                 DateKey, DateFull, FullYear,
                 QuarterNumber, WeekNumber, WeekDayName,
                 MonthDay, MonthName, YearDay,
                 DateDefinition,
                        CharacterDate,
                        WeekDay,
                        MonthNumber
             )

             SELECT
                 CONVERT(VARCHAR(8), dateInsert, 112), dateInsert, YEAR(@Date),
                 DATEPART(qq, dateInsert), DATEPART(ww, dateInsert), DATENAME(dw, dateInsert),
                 DATEPART(dd, dateInsert), DATENAME(mm, dateInsert), DATEPART(dy,@Date),
                       DATENAME(mm, dateInsert) + ' ' + CAST(DATEPART(dd, dateInsert) AS CHAR(2)) + ',   
                   ' + CAST(DATEPART(yy, dateInsert) AS CHAR(4)),
                   CONVERT(VARCHAR(10), dateInsert, 101),
                   DATEPART(dw, dateInsert),
                   DATEPART(mm, dateInsert)

             SET dateInsert = DATEADD(dd, 1, dateInsert)
        END
     END WHILE;
END $$
1 голос
/ 07 июля 2011

Измените даты на формат гггг-мм-дд:

DECLARE dateInsert DATETIME
 SET dateInsert = '1900-01-01'

 WHILE dateInsert < '2100-01-01'

....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...