Пользовательское форматирование Даты/Времени в SQL Server

Убедитесь, что в вашем package.json есть "types": "./QDatabase/Docs/QDb.d.ts". Больше информации о документах TypeScript по публикации пакетов

12
задан Cade Roux 14 October 2008 в 19:35
поделиться

5 ответов

Если dt является Вашим столбцом даты и времени, то

Для 1:

SUBSTRING(CONVERT(varchar, dt, 13), 1, 2)
    + UPPER(SUBSTRING(CONVERT(varchar, dt, 13), 4, 3))

Для 2:

SUBSTRING(CONVERT(varchar, dt, 100), 13, 2)
    + SUBSTRING(CONVERT(varchar, dt, 100), 16, 3)
6
ответ дан 2 December 2019 в 03:10
поделиться

Не ответ на Ваш вопрос а именно, но не то, что что-то, что должно быть обработано уровнем представления Вашего приложения. При выполнении его способ, которым Вы описываете, создает дополнительную обработку на конце базы данных, а также добавление дополнительного сетевого трафика (предполагающий, что база данных существует на другой машине, чем приложение), для чего-то, что могло быть легко вычислено на стороне приложения, с более богатыми библиотеками обработки даты, а также быть большим количеством агностика языка, особенно в случае Вашего первого примера, который содержит сокращенное имя месяца. Так или иначе другие ответов дают Вам, должен указать на Вас в правильном направлении, если Вы все еще решаете пойти этим путем.

6
ответ дан 2 December 2019 в 03:10
поделиться

поле формата Даты и времени имеет следующий формат 'YYYY-MM-DD HH:MM:SS.S'

, Что оператор является ложью. Это, как Руководитель предприятия или SQL Server выбирают к шоу дата. Внутренне это - 8-байтовое двоичное значение, которое является, почему некоторые функции, отправленные Andrew, будут работать так хорошо.

Kibbee делает справедливое замечание также, и в идеальном мире я согласился бы с ним. Однако иногда Вы хотите обязать результаты запроса непосредственно отображать управление или виджеты и существует действительно не шанс сделать любое форматирование. И иногда уровень представления живет на веб-сервере, это еще более занято, чем база данных. С теми в памяти, это - не обязательно плохая вещь знать, как сделать это в SQL.

4
ответ дан 2 December 2019 в 03:10
поделиться

Используйте DATENAME и оберните логику в Функцию, не Сохраненный Proc

declare @myTime as DateTime

set @myTime = GETDATE()

select @myTime

select DATENAME(day, @myTime) + SUBSTRING(UPPER(DATENAME(month, @myTime)), 0,4)

Возвраты "14 октября"

Попытка не использовать любой Символ / основанные на строке операции если возможный при работе с датами. Они являются числовыми (плавание), и производительность пострадает от тех преобразований типа данных.

Роют эти удобные преобразования, которые я скомпилировал за эти годы...

/* Common date functions */
--//This contains common date functions for MSSQL server

/*Getting Parts of a DateTime*/
    --//gets the date only, 20x faster than using Convert/Cast to varchar
    --//this has been especially useful for JOINS
    SELECT (CAST(FLOOR(CAST(GETDATE() as FLOAT)) AS DateTime))

    --//gets the time only (date portion is '1900-01-01' and is considered the "0 time" of dates in MSSQL, even with the datatype min value of 01/01/1753. 
    SELECT (GETDATE() - (CAST(FLOOR(CAST(GETDATE() as FLOAT)) AS DateTime)))


/*Relative Dates*/
--//These are all functions that will calculate a date relative to the current date and time
    /*Current Day*/
    --//now
    SELECT (GETDATE())

    --//midnight of today
    SELECT (DATEADD(ms,-4,(DATEADD(dd,DATEDIFF(dd,0,GETDATE()) + 1,0))))

    --//Current Hour
    SELECT DATEADD(hh,DATEPART(hh,GETDATE()),CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DateTime))

    --//Current Half-Hour - if its 9:36, this will show 9:30
    SELECT DATEADD(mi,((DATEDIFF(mi,(CAST(FLOOR(CAST(GETDATE() as FLOAT)) as DateTime)), GETDATE())) / 30) * 30,(CAST(FLOOR(CAST(GETDATE() as FLOAT)) as DateTime)))

    /*Yearly*/
    --//first datetime of the current year
    SELECT (DATEADD(yy,DATEDIFF(yy,0,GETDATE()),0))

    --//last datetime of the current year
    SELECT (DATEADD(ms,-4,(DATEADD(yy,DATEDIFF(yy,0,GETDATE()) + 1,0))))

    /*Monthly*/
    --//first datetime of current month
    SELECT (DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0))

    --//last datetime of the current month
    SELECT (DATEADD(ms,-4,DATEADD(mm,1,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0))))

    --//first datetime of the previous month
    SELECT (DATEADD(mm,DATEDIFF(mm,0,GETDATE()) -1,0))

    --//last datetime of the previous month
    SELECT (DATEADD(ms, -4,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)))

    /*Weekly*/
    --//previous monday at 12AM
    SELECT (DATEADD(wk,DATEDIFF(wk,0,GETDATE()) -1 ,0))

    --//previous friday at 11:59:59 PM
    SELECT (DATEADD(ms,-4,DATEADD(dd,5,DATEADD(wk,DATEDIFF(wk,0,GETDATE()) -1 ,0))))

    /*Quarterly*/
    --//first datetime of current quarter
    SELECT (DATEADD(qq,DATEDIFF(qq,0,GETDATE()),0))

    --//last datetime of current quarter
    SELECT (DATEADD(ms,-4,DATEADD(qq,DATEDIFF(qq,0,GETDATE()) + 1,0)))
25
ответ дан 2 December 2019 в 03:10
поделиться

Вы испытываете необходимость в DATEPART здесь. Можно конкатенировать, результаты DATEPART собирает.

Для получения сокращений месяца Вы могли бы быть в состоянии использовать DATENAME; если это не работает на Вас, можно использовать Оператор выбора на DATEPART.

DATEPART также работает на поле времени.

я могу думать о нескольких способах получить индикатор AM/PM, включая сравнение новых дат, созданных через DATEPART, или вычисление общих секунд протекло в день и сравнение, которое к известному/PM пороги.

0
ответ дан 2 December 2019 в 03:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: