Как создать даты из компонентов даты в SQL (T-SQL)? - PullRequest
7 голосов
/ 24 апреля 2011

Как я могу построить собственные значения типа данных даты в SQL (T-SQL)?

Я добавил несколько примеров, но, пожалуйста, предоставьте свои.Мои примеры предполагают, что месяц и год хранятся (или легко доступны) в виде целочисленных значений, но, возможно, ваш пример будет предполагать, что день и месяц (или что-то еще) сохраняются в виде текста.Я не вижу будущего;удиви меня.

Ответы [ 5 ]

20 голосов
/ 21 июля 2011
SELECT DATEFROMPARTS(@Year, @Month, @Day)

( Из SQL Server 2012 )

6 голосов
/ 25 апреля 2011

Почему, с входными данными в виде строк, одним из наиболее очевидных (и поэтому неудивительных, извините) решений было бы:

SELECT
  mydate = CAST([year] + RIGHT('0' + [month], 2) + '01' AS datetime)
                                           /* or 'AS date' in SQL Server 2008+ */
FROM (
  SELECT [month] = '2',  [year] = '2011' UNION ALL
  SELECT [month] = '03', [year] = '2011' UNION ALL
  SELECT [month] = '5',  [year] = '2011' UNION ALL
  SELECT [month] = '12', [year] = '2011' UNION ALL
  SELECT [month] = '8',  [year] = '2084' UNION ALL
  SELECT [month] = '1',  [year] = '1940'
) x;
1 голос
/ 25 апреля 2011

Значения даты из значений года, месяца и дня (целого числа), хотя, возможно, входные данные следует сначала санировать:

SELECT  DATEADD(
            day,
            x.[day] - DAY(0),
            DATEADD(
                month,
                x.[month] - MONTH(0),
                DATEADD(
                    year,
                    x.[year] - YEAR(0),
                    0 ) ) )
FROM (  SELECT [month] = 2, [year] = 2011, [day] = 14
        UNION ALL
        SELECT [month] = 3, [year] = 2011, [day] = 2
        UNION ALL
        SELECT [month] = 5, [year] = 2011, [day] = 1
        UNION ALL
        SELECT [month] = 7, [year] = 2011, [day] = 0
        UNION ALL
        SELECT [month] = 8, [year] = 2084, [day] = 40
        UNION ALL
        SELECT [month] = 1, [year] = 1940, [day] = -6
    ) x;
1 голос
/ 24 апреля 2011

Следующий код показывает, как создавать значения даты из значений года и месяца (целые числа):

SELECT  DATEADD(
            month,
            DATEDIFF( month, 0, GETDATE() )
                + x.[month]
                - MONTH( GETDATE() ),
            DATEADD(
                year,
                DATEDIFF( year, 0, GETDATE() )
                    + x.[year]
                    - YEAR( GETDATE() ),
                0 ) )
FROM (  SELECT [month] = 2, [year] = 2011
        UNION ALL
        SELECT [month] = 3, [year] = 2011
    ) x;
0 голосов
/ 25 апреля 2011

Еще пример кода для создания значений даты из значений года и месяца (целое число), но даже проще, чем какой-либо другой пример кода:

SELECT  DATEADD(
            month,
            x.[month] - MONTH(0),
            DATEADD(
                year,
                x.[year] - YEAR(0),
                0 ) )
FROM (  SELECT [month] = 2, [year] = 2011
        UNION ALL
        SELECT [month] = 3, [year] = 2011
        UNION ALL
        SELECT [month] = 5, [year] = 2011
        UNION ALL
        SELECT [month] = 7, [year] = 2011
        UNION ALL
        SELECT [month] = 8, [year] = 2084
        UNION ALL
        SELECT [month] = 1, [year] = 1940
    ) x;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...